You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
            }
        }
    }
}

错误原因

  1. 文件格式不匹配:原代码用ExcelDataReader读取XLSB后,通过EPPlus创建新文件时默认保存为XLSX格式,但后缀写的是XLSB,导致文件签名不匹配,触发"Invalid File Signature"错误。
  2. 丢失原文件结构:原代码仅将修改后的工作表写入新文件,完全丢失了原文件的数据透视表、格式等其他内容,无法验证数据透视表的更新。
  3. 操作逻辑冗余:同时使用两个库读写文件,既增加复杂度,又容易出现格式兼容问题。

解决方法

直接使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 08:48:11