【问题标题】:Code only converting last worksheet to csv仅代码将最后一个工作表转换为 csv
【发布时间】:2019-06-21 17:12:40
【问题描述】:

我用 C# 编写了一个程序,该程序应该将我的 excel 工作簿中的每个工作表转换为 csv 并将其保存在自己的文件中。我遇到的问题是,当我打开每个文件时,它们都具有与最后一个工作表相同的内容。这是我的代码:

public void Main()
{
    Excel.Application excelApp = new Excel.Application();
    Excel.Workbook workbook = excelApp.Workbooks.Open(@"C:\Users\user\Desktop\Book1.xlsx");

    foreach (Excel.Worksheet sht in workbook.Worksheets)
    {
        sht.Select();
        System.Diagnostics.Debug.WriteLine(sht.Name.ToString());
        workbook.SaveAs(string.Format("{0}{1}.csv", @"C:\Users\user\Desktop\", sht.Name), Excel.XlFileFormat.xlCSV, Excel.XlSaveAsAccessMode.xlNoChange);
    }

    workbook.Close(false);

    Dts.TaskResult = (int)ScriptResults.Success;
}

任何帮助都会很棒,谢谢!


更新 1

我不知道是否值得一提,我正在尝试通过 SSIS 中的脚本任务来执行此操作。所以这只是我运行的一个包含上述代码的脚本任务。

【问题讨论】:

  • 否 @jdweng - OP 正在保存 workbook 而不是 worksheet。将workbook 保存为 CSV 将默认为仅保存工作表本身。在这种情况下,最后一张。将您的 worksheet 保存为 CSV。此行:workbook.SaveAs 是您的问题。
  • @MosheKatz - 是的,名称是迭代的。内容不是。
  • 调试行是否显示所有工作表名称?工作表和工作表之间存在差异。工作表有许多不同的类型,一种是工作表。所以试试 :Excel.Worksheet sht in workbook.Sheets
  • 而不是使用 workbook.SaveAs 尝试 sht.SaveAs.
  • @jdweng 我尝试了这两个建议。它的行为似乎仍然相同,并给我相同的输出

标签: c# excel csv ssis script-task


【解决方案1】:

试图找出问题

在正常情况下,您提供的代码将完美运行。如果excel应用程序显示一个消息框,需要权限才能启用编辑,访问其他工作表时存在权限问题,因为它们受到保护,可能会遇到一些问题......

首先,手动打开excel并检查您是否可以访问所有工作表并手动执行保存操作。如果您没有遇到任何问题,那么您应该在使用 Interop.Excel 库时阻止 excel 显示消息框或其他促销。

此外,请检查目标路径中是否不存在该 Csv。

尝试使用类似的代码:

Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
excelApp.Visible = false;
excelApp.DisplayAlerts = false;

Microsoft.Office.Interop.Excel.Workbook workbook = excelApp.Workbooks.Open(@"D:\Book1.xlsx");
workbook.DoNotPromptForConvert = true;
workbook.CheckCompatibility = false;

foreach (Microsoft.Office.Interop.Excel.Worksheet sht in workbook.Worksheets)
{
    sht.Select();
    System.Diagnostics.Debug.WriteLine(sht.Name.ToString());

    if (System.IO.File.Exists(string.Format("{0}{1}.csv", @"D:\", sht.Name)))
    {
        System.IO.File.Delete(string.Format("{0}{1}.csv", @"D:\", sht.Name);

    }

    workbook.SaveAs(string.Format("{0}{1}.csv", @"D:\", sht.Name),
                                  Microsoft.Office.Interop.Excel.XlFileFormat.xlCSV, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange);
}

//workbook.Close(false);
workbook.Close(false, Type.Missing, Type.Missing);
excelApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);

我测试了以下代码,它成功转换了所有工作表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 2023-03-12
    • 2018-08-13
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多