使用合并单元格,表单控件,受密码保护的工作表读取Excel

时间:2012-09-28 03:08:06

标签: c# .net-4.0

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

以下是要求:

我需要在没有安装Excel的服务器上实际读取它。

我无法使用OLE 4驱动程序,因为它有合并单元格的问题,数据被删除。或者也许像表单控件这样的东西会把它扔掉。

Excel阻止我将受密码保护的电子表格保存为XML,我们将无法使用密码。

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

我在CodeProject上尝试了一个示例项目,该项目读取了原生BIFF格式,它在2003年运行良好,但是在2007年和2010年窒息,我们很快就会升级,所以我不想计划很快就过时了。

是否有一个好的,可靠的公司责任友好型开源库,用于阅读可能阅读此电子表格的原生XLS格式,或者我是否需要确定是否需要说服我的经理我们需要购买第三方产品或获得皮塔公司例外以在服务器上安装Excel。如果没有其他选择,前者是首选方法。

什么是我最好的选择,或者什么是可靠的第三方图书馆?

THX

1 个答案:

答案 0 :(得分:0)

我不确定这正是您所需要的,但如果您使用NPOI(不是Gembox),您可以阅读并修改受保护的工作簿并保存它们。例如,您可以尝试这样的soimething来读取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);