【问题标题】:Avoid Google Spreadsheet to convert an XLSX file created by Open XML SDK to XLSM避免使用 Google 电子表格将 Open XML SDK 创建的 XLSX 文件转换为 XLSM
【发布时间】:2021-12-11 23:41:05
【问题描述】:

我正在使用Open XML SDK 2.14.0 创建 Excel 文件。 如果我将 Open XML SDK 生成的 XLSX 文件上传到 Google 电子表格,它会将文件作为 XLSX 文件打开,但如果我在电子表格中进行任何更改,那么 Google 电子表格会将文件类型更改为 XLSM。

下面的简约代码 (found in the official documentation) 重现了我遇到的问题。它在C:\Temp 中生成一个foo.xlsx 文件。

var filepath = @"C:\temp\foo.xlsx";

// Create a spreadsheet document by supplying the filepath.
// By default, AutoSave = true, Editable = true, and Type = xlsx.
SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(filepath, SpreadsheetDocumentType.Workbook);

// Add a WorkbookPart to the document.
WorkbookPart workbookpart = spreadsheetDocument.AddWorkbookPart();
workbookpart.Workbook = new Workbook();

// Add a WorksheetPart to the WorkbookPart.
WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
worksheetPart.Worksheet = new Worksheet(new SheetData());

// Add Sheets to the Workbook.
Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets());

// Append a new worksheet and associate it with the workbook.
Sheet sheet = new Sheet() { Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "mySheet" };
sheets.Append(sheet);

workbookpart.Workbook.Save();

// Close the document.
spreadsheetDocument.Close();

如果我将生成的文件上传到 Google 电子表格,它会显示这是一个 XLSX 文件。

但如果我更改工作簿中的任何内容,Google 电子表格会将文件类型更改为 XLSM。

如果我从 MS Excel (Office 360​​) 生成一个空工作簿,我没有这个问题:如果我更改数据,Google 电子表格将不会更改文件类型。

为什么 Google 电子表格在 Open XML SDK 生成的 XLSX 文件中会出现这样的行为? 我应该怎么做才能使用 Open XML SDK 生成一个未通过 Google 电子表格转换为 XLSM 的 XLSX 文件?

【问题讨论】:

  • 在您的情况下,mimeType 在编辑您的 XLSX 文件之前和之后是否发生了变化?
  • 感谢您的评论。我刚刚运行了提供的代码,将文件上传到 Google 电子表格并进行了更改。我没有明确更改任何 mimeType。我不确定你的问题。如何更改文件的 mimeType 并检查 mime 类型是否已更改?
  • 感谢您的回复。我带来的不便表示歉意。关于How could I change the mimeType of the file的问题1,我无法测试您的情况。但在 Google Drive,Drive API 或许能够改变它。关于你could I check if the mime type has changed ? 的问题2,作为一个简单的方法,你可以通过Drive API的“Try this API of "Files: get"来查看文件的mimeType。Ref
  • 调用Drive API需要有一个GCP账号和配置一堆东西,我对GCP不熟悉。我不确定这会有什么帮助。我只是像基本用户一样使用 Google 电子表格。也就是说,如果我使用 Chrome 开发工具,我可以看到 XLSX 和 XLSM 文件都具有相同的 mime 类型:“application/vnd.openxmlformats-officedocument.spreadsheetml.sheet”。
  • 感谢您的回复。看来XLSXXLSM的mimeTypes是application/vnd.openxmlformats-officedocument.spreadsheetml.sheetapplication/vnd.ms-excel.sheet.macroEnabled.12。从您的回复中发现,即使将显示扩展名从XLSX 更改为XLSM,在编辑前后mimeType 也没有改变。从这种情况来看,我认为这可能是一个错误。那么如何向Google issue tracker 报告您的情况?因为我在问题跟踪器中找不到这个问题。

标签: google-sheets openxml-sdk


【解决方案1】:

OfficeDev 团队的一位好人找到了解决方案:https://github.com/OfficeDev/Open-XML-SDK/issues/1093

我在这里发布解决方案。看来我们需要打电话给spreadsheetDocument.AddCoreFilePropertiesPart();

因此我的代码看起来像:

var filepath = @"C:\temp\foo.xlsx";

// Create a spreadsheet document by supplying the filepath.
// By default, AutoSave = true, Editable = true, and Type = xlsx.
SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(filepath, SpreadsheetDocumentType.Workbook);
var coreFilePropPart = spreadsheetDocument.AddCoreFilePropertiesPart();

// With DocumentFormat.OpenXml 2.14.0, AddCoreFilePropertiesPart includes an empty core.xml without a root which leads to an error when the generated file is opened in Excel
using (XmlTextWriter writer = new XmlTextWriter(coreFilePropPart.GetStream(FileMode.Create), System.Text.Encoding.UTF8))
{
  writer.WriteRaw("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<cp:coreProperties xmlns:cp=\"https://schemas.openxmlformats.org/package/2006/metadata/core-properties\"></cp:coreProperties>");
  writer.Flush();
}

// Add a WorkbookPart to the document.
WorkbookPart workbookpart = spreadsheetDocument.AddWorkbookPart();
workbookpart.Workbook = new Workbook();

// Add a WorksheetPart to the WorkbookPart.
WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
worksheetPart.Worksheet = new Worksheet(new SheetData());

// Add Sheets to the Workbook.
Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets());

// Append a new worksheet and associate it with the workbook.
Sheet sheet = new Sheet() { Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "mySheet" };
sheets.Append(sheet);

workbookpart.Workbook.Save();

// Close the document.
spreadsheetDocument.Close();

因此,Google 表格停止从 XLSX 更改为 XLSM!

【讨论】:

    猜你喜欢
    • 2022-07-19
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多