【问题标题】:How to work with .xlsm via C# .NET?如何通过 C# .NET 使用 .xlsm?
【发布时间】:2014-08-05 22:44:08
【问题描述】:

我有 C# 应用程序,用于从 excel 中删除前几行,然后将文件格式化为 .csv,但现在我得到的不是 .xlsx 而是 .xlsm,我找不到如何使用,我什至无法从列中加载数据。它来自 SAP 的一些报告文件,我在里面找不到任何宏。我试过这样的东西

        /* Load Excel File */
        Excel.Application excelApp = new Excel.Application();
        string workbookPath = @"file.xlsm";
        Excel.Workbook excelWorkbook = excelApp.Workbooks.Open(workbookPath, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);

        /* Load worksheets collection */
        Excel.Sheets excelSheets = excelWorkbook.Worksheets;

        /* Select first worksheet */
        Excel.Worksheet excelWorksheet = (Excel.Worksheet)excelSheets[1];

        /* Deleting first 87 Rows */
        Excel.Range range = excelWorksheet.get_Range("1:87").EntireRow;
        range.Delete(Excel.XlDeleteShiftDirection.xlShiftUp);

        /* Save File */
        excelWorkbook.SaveAs(@"out_file.xlsm");
        excelWorkbook.Close(false);
        excelApp.Application.Quit();

        /* Release COM objects otherwise Excel remain running */
        releaseObject(range);
        releaseObject(excelWorkbook);
        releaseObject(excelWorksheet);
        releaseObject(excelApp);

这适用于 .xlsx 扩展名(它将删除行并将其保存在另一个名称下)但不适用于 .xlsm(程序成功运行但它不会删除数据)。即使我手动将 Excel 文件另存为 .xlsx 并在该文件上运行程序,它也不起作用,但如果我手动将粘贴数据复制到另一个 .xlsx 并在该文件上运行程序,它可以工作,我不明白。如何重写此程序以从 .xlsm 文件中删除行?请帮忙,谢谢。

【问题讨论】:

  • 您是否尝试将文件格式提供给SaveAs?这段代码也应该在 XLSM 上工作。
  • 我知道 EPPLUS 库可以并且将与 xlsx 文件和 xlsm 文件一起使用。此外,它的速度更快。
  • 尝试添加excelApp.Visible = true;。这将显示 excel UI,您可以看到里面发生了什么
  • shree.pat18: 我试过 excelWorkbook.SaveAs(@"file.xlsm", Excel.XlFileFormat.xlWorkbookNormal);它也不起作用。 Alireza:它打开和关闭excel,仅此而已。 Christian Sauer:谢谢,我会看的。如果您有这方面的经验,可以在这里发布一些代码吗?

标签: c# xlsm


【解决方案1】:

感谢 Christian Sauer,EPPLUS.dll 工作正常。

第一步

解决方案资源管理器 > 项目名称 > 添加 > 参考 > 浏览到 EPPLUS.dll

第 2 步

using OfficeOpenXml;
using OfficeOpenXml.Style;
using System.IO;

第 3 步(删除行范围)

 using (var p = new ExcelPackage(new FileInfo(@"file.xlsm")))
            {
                var sheet = p.Workbook.Worksheets["Sheet1"];
                sheet.DeleteRow(1, 87);
                p.SaveAs(new FileInfo(@"output.xlsm"));
            }
)

第 4 步(将 .xlsm 导出为 .csv)

在这两行之间插入代码

                sheet.DeleteRow(1, 87);
           ====>[HERE]
                p.SaveAs(new FileInfo(@"output.xlsm"));

/* Code placed to [HERE] placeholder */
using (var writer = File.CreateText(@"output.csv"))
            {
                var rowCount = sheet.Dimension.End.Row;
                var columnCount = sheet.Dimension.End.Column;
                for (var r = 1; r <= rowCount; r++)
                {
                    for (var c = 1; c <= columnCount; c++)
                    {
                        writer.Write(sheet.Cells[r, c].Value);
                        writer.Write(";");
                    }
                    writer.WriteLine();
                }
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多