WinForms操作XLSB文件触发Invalid File Signature错误求助
问题:WinForms操作XLSB文件时出现"Invalid File Signature"错误
我开发了一个WinForms应用,点击按钮后要读取、修改XLSB文件的特定单元格(第15930行、第17列,值改为100),并验证数据透视表是否同步更新。使用了ExcelDataReader、ExcelDataReader.Dataset、EPPlus三个库,但点击按钮后报错:"Invalid File Signature"。
原事件处理代码如下:
using ExcelDataReader; using OfficeOpenXml; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace ExcelModifierNew { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { try { string inputFilePath = @"C:\Users\zzk51\Downloads\North 1 PvsT.xlsb"; // Input XLSB file path string outputFilePath = @"C:\Users\zzk51\Downloads\North 1 PvsT_modified.xlsb"; // Output XLSB file path // Read the XLSB file using ExcelDataReader using (FileStream stream = File.Open(inputFilePath, FileMode.Open, FileAccess.Read)) { using (IExcelDataReader reader = ExcelReaderFactory.CreateBinaryReader(stream)) { DataSet result = reader.AsDataSet(); // Modifying the specific cell value if (result.Tables.Count > 0) { DataTable worksheet = result.Tables[1]; //For the second worksheet // Modifying the cell value (row 15930, column 17) to 100 if (worksheet.Rows.Count >= 15930 && worksheet.Columns.Count >= 17) { worksheet.Rows[15929][16] = 100; } else { MessageBox.Show("Cell not found. Ensure the worksheet has enough rows and columns."); return; } // Saving the changes using EPPlus using (var package = new ExcelPackage(new FileInfo(outputFilePath))) { ExcelWorksheet ws = package.Workbook.Worksheets.Add("Worksheet1"); ws.Cells.LoadFromDataTable(worksheet, true); package.Save(); } MessageBox.Show("Excel file modified successfully. Saved as: " + outputFilePath); } } } } catch (Exception ex) { MessageBox.Show("Error: " + ex.Message); } } } }
错误原因
- 文件格式不匹配:原代码用ExcelDataReader读取XLSB后,通过EPPlus创建新文件时默认保存为XLSX格式,但后缀写的是XLSB,导致文件签名不匹配,触发"Invalid File Signature"错误。
- 丢失原文件结构:原代码仅将修改后的工作表写入新文件,完全丢失了原文件的数据透视表、格式等其他内容,无法验证数据透视表的更新。
- 操作逻辑冗余:同时使用两个库读写文件,既增加复杂度,又容易出现格式兼容问题。
解决方法
直接使用EPPlus操作原XLSB文件,保留所有结构并正确修改单元格,步骤如下:
1. 确认EPPlus版本
确保安装的是EPPlus 5.0及以上版本(支持XLSB格式),可通过NuGet安装。
2. 设置EPPlus许可证
新版本EPPlus需要声明许可证类型,在应用启动时添加(比如在Program.cs的Main方法中):
ExcelPackage.LicenseContext = LicenseContext.NonCommercial; // 非商业使用,商业使用需设置为Commercial并购买许可证
3. 修改按钮事件代码
替换原button1_Click方法,直接用EPPlus打开、修改、保存XLSB文件,并刷新数据透视表:
private void button1_Click(object sender, EventArgs e) { try { string inputFilePath = @"C:\Users\zzk51\Downloads\North 1 PvsT.xlsb"; string outputFilePath = @"C:\Users\zzk51\Downloads\North 1 PvsT_modified.xlsb"; // 复制原文件到输出路径,避免修改原文件 File.Copy(inputFilePath, outputFilePath, overwrite: true); // 打开输出文件(复制后的原文件) using (var package = new ExcelPackage(new FileInfo(outputFilePath))) { // 获取原始数据工作表(第二个标签页,索引从1开始) ExcelWorksheet dataWs = package.Workbook.Worksheets[2]; // 验证单元格是否存在 if (dataWs.Dimension.End.Row >= 15930 && dataWs.Dimension.End.Column >= 17) { // 修改单元格值(EPPlus行/列从1开始,直接对应Excel的15930行、17列) dataWs.Cells[15930, 17].Value = 100; // 刷新所有数据透视表,确保数据同步 foreach (ExcelPivotTable pivotTable in package.Workbook.PivotTables) { pivotTable.RefreshData(); pivotTable.CalculateData(); } // 保存修改,指定格式为XLSB package.SaveAs(new FileInfo(outputFilePath), ExcelPackage.XLSB); MessageBox.Show("文件修改成功,已保存至:" + outputFilePath); } else { MessageBox.Show("指定单元格不存在,请确认工作表的行和列数量。"); } } } catch (Exception ex) { MessageBox.Show("错误:" + ex.Message); } }
注意事项
- 如果原文件的原始数据工作表不是第二个标签页,需要修改
package.Workbook.Worksheets[2]中的索引(索引从1开始)。 - 商业使用EPPlus需要购买并设置对应的商业许可证,否则会有功能限制。
- 修改后打开输出文件时,Excel可能会提示"文件格式与扩展名不匹配",确认打开即可,这是EPPlus保存XLSB时的正常现象。
内容的提问来源于stack exchange,提问作者Satyam
相关产品推荐
相关产品推荐

