如何通过C#.NET使用.xlsm?

如何通过C#.NET使用.xlsm?,c#,xlsm,C#,Xlsm,我有一个C#应用程序,可以从excel中删除前几行,然后将文件格式化为.csv,但现在我得到的不是.xlsx,而是.xlsm,我找不到如何使用它,我甚至无法从列中加载数据。这是SAP的一些报告文件,我在里面找不到任何宏。我试过这样的东西 /* Load Excel File */ Excel.Application excelApp = new Excel.Application(); string workbookPath = @"file.xl

我有一个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文件中的行?请帮助,谢谢。

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

第一步 解决方案资源管理器>项目名称>添加>引用>浏览到EPPLUS.dll

步骤2 步骤3(删除行范围) 步骤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();
                }
            }
sheet.DeleteRow(1,87);
=>[这里]
p、 SaveAs(新文件信息(@“output.xlsm”);
/*放置到[此处]占位符的代码*/
使用(var writer=File.CreateText(@“output.csv”))
{
var rowCount=sheet.Dimension.End.Row;
var columnCount=sheet.Dimension.End.Column;

对于(var r=1;r您是否尝试将文件格式提供给
SaveAs
?此代码在XLSM上也应如此。我知道库EPPLUS可以并且将同时处理xlsx文件和XLSM文件。此外,它的速度更快。请尝试添加
excelApp.Visible=true;
。这将显示excel UI,您可以看到在中发生的情况deshree.pat18:我试过excelWorkbook.SaveAs(@“file.xlsm”,Excel.XlFileFormat.xlWorkbookNormal);但它也不起作用。Alireza:它可以打开和关闭Excel,仅此而已。Christian Sauer:谢谢,我会看看它。如果你有使用它的经验,你能在这里发布一些代码吗?
 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"));
            }
)
                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();
                }
            }