0

我需要阅读来自政府 HHS 部门的 Excel 2003 电子表格。XLS 已合并单元格、受密码保护的宏和表单控件(例如,按钮、下拉菜单)。

以下是要求:

我需要在没有安装 Excel 的服务器上务实地阅读此内容。

我不能使用 OLE 4 驱动程序,因为它存在合并单元格的问题,数据被丢弃。或者也许其他的东西,比如表单控件正在把它扔掉。

Excel 阻止我将受密码保护的电子表格保存为 XML,我们将没有密码。

我尝试使用 Excel 2007 和 2010 将其保存为 XLSX 并使用 ACE OLE Excel 驱动程序。合并的单元格似乎不是问题,但表单控件是问题(也许使用 JET 驱动程序也是如此)。

我在 CodeProject 上尝试了一个读取本机 BIFF 格式的示例项目,它在 2003 年运行良好,但在 2007 年和 2010 年出现了阻塞,我们可能很快就会升级,所以我不想计划它很快就会过时。

是否有一个好的、可靠的、对企业责任友好的开源库来读取可能会读取此电子表格的本机 XLS 格式,或者我是否必须决定是否需要说服我的经理我们需要购买第 3 方产品或获得在服务器上安装 Excel 的皮塔公司例外。如果没有其他选择,前者是首选方法。

什么是我最好的选择,或者什么是一个可靠的 3rd 方库?

谢谢

4

1 回答 1

0

我不确定这是否正是您所需要的,但如果您使用NPOI(不是 Gembox),您可以阅读和修改受保护的工作簿并保存它们。例如,您可以尝试像这样读取 A1 单元格的值,修改 D4 的值并保存结果。即使工作簿受到保护(您不能使用 Excel 修改 x.xls),这项工作也能正常工作。

        string fullPath = @"c:\tmp\x.xls";
        FileStream aFile = new FileStream(fullPath, FileMode.Open, FileAccess.Read);
        HSSFWorkbook wb = new HSSFWorkbook(aFile);
        aFile.Close();
        ISheet curSheet = wb.GetSheet("Foglio1");
        IRow aRow = curSheet.GetRow(0);
        if (aRow == null)
            aRow = curSheet.CreateRow(0);
        ICell aCell = aRow.GetCell(0);
        if (aCell == null)
            aCell = aRow.CreateCell(0);
        MessageBox.Show(aCell.StringCellValue);
        aRow = curSheet.GetRow(3);
        if (aRow == null)
            aRow = curSheet.CreateRow(3);
        aCell = aRow.GetCell(3);
        if (aCell == null)
            aCell = aRow.CreateCell(3);
        aCell.SetCellValue("testValue");
        fullPath = @"c:\tmp\x2.xls";
        File.Delete(fullPath);
        aFile = new FileStream(fullPath, FileMode.Create);
        wb.Write(aFile);
        aFile.Close();

不幸的是,没有办法使用 NPOI 取消保护工作表(至少不是我知道的一种方式),但是您可以将密码设置为您想要的任何内容,即使不知道原始密码也是如此。它很简单:

curSheet.ProtectSheet(string.Empty);
于 2012-10-10T05:41:24.740 回答