I have run into the same problem you face many times. I don't know if this is the best way, but I normally use
Spreadsheet::XLSX for reading the file, but then I go back to open the file with
Win32::OLE to update the fields that I need to change. It is a two-step process.