首页 > 解决方案 > 使用 excel 的服务中的方法未保存并且似乎不会产生异常

问题描述

我的服务中有一些代码有问题。该方法只是创建需要创建的报表的数据表,然后将其写入现有的 excel 文件。问题是它在保存文件时失败。更奇怪的是,它似乎没有发现错误,我不知道为什么。我已经包含了下面的代码。注意:

  1. excel.可见=真;似乎每次都没有使 excel 表可见,所以我无法真正看到 excel 本身发生了什么。我认为它不会变得可见,因为它是一项服务,但我真的不知道。

  2. 我知道数据表正在生成输出,因为我有日志(这只是一个文本文件,我可以在其中编写事件和错误)写入单元格值及其位置,并且它从未在 Foreach 循环或 for在里面循环

  3. 我知道它在 wb.Save(); 上失败了。因为 Log.WriteLine("WriteTIByEmp 4"); 成功写入文本文件,但 Log.WriteLine("WriteTIByEmp 5"); 才不是。

  4. catch (Exception ex) 似乎也不起作用,因为它没有写任何关于异常的内容,但甚至没有写 Log.WriteLine("Catching Exception");,所以我有点迷茫.

编辑:请注意,这都是在 excel 部分中使用 Interops。只是在类的顶部声明了“使用 Microsoft.Office.Interop.Excel”以节省时间和打字,因为这个特定类中的几乎所有方法都使用 excel。excel文件在这个过程中一直打开,我可以在任务管理器中看到,在这个过程中我有其他方法成功写入excel文件。只有这种特殊的方法有问题。

public void WriteTIByEmp(CI.WriteReport Log)
    {
        try
        {
            System.Data.DataTable Emps = Pinpoint.TICardsByEmpStatsDaily.GetTICardsByEmployer();
            Log.WriteLine("WriteTIByEmp 1");
            Application excel = new Application();
            excel.Visible = true;
            Workbook wb = excel.Workbooks.Open(TIEMPPath);
            Worksheet ws = wb.Worksheets[1];
            ws.Range["A:G"].Clear();
            Log.WriteLine("WriteTIByEmp 2");

            int RowNum = 0;
            int ColCount = Emps.Columns.Count;

            Log.WriteLine("WriteTIByEmp 3");
            foreach (DataRow dr in Emps.Rows)
            {
                RowNum++;
                for (int i = 0; i < ColCount; i++)
                {
                    ws.Cells[RowNum, i + 1] = dr[i].ToString();
                    Log.WriteLine("Cell Val:" + dr[i].ToString() + ".  Cell Location: " + RowNum + "," + i);
                }
            }
            Log.WriteLine("WriteTIByEmp 4");
            wb.Save();
            Log.WriteLine("WriteTIByEmp 5");
            wb.Close();
            Log.WriteLine("WriteTIByEmp 6");
            excel = null;
            Log.WriteLine("WriteTIByEmp 7");

        }
        catch (Exception ex)
        {
            Log.WriteLine("Catching Exception");

            var st = new StackTrace(ex, true);
            var frame = st.GetFrame(0);
            var line = frame.GetFileLineNumber();

            string msg = "Component Causing Error:" + ex.Source + System.Environment.NewLine + "Error Message: " + ex.Message + System.Environment.NewLine + "Line Number: " + line + System.Environment.NewLine + System.Environment.NewLine;

            Log.WriteLine(msg, true);
        }
    }

标签: c#visual-studioservice

解决方案


我也遇到过类似的情况。

注意:虽然使用 Interop Excel 是一个依赖项,但访问该文件的其他进程可能会导致问题。因此,我推荐使用 EPPlus Nuget Package,因为它可以创造奇迹。

https://www.nuget.org/packages/EPPlus/

请参考下面的示例代码。

FileInfo fi = new FileInfo(ExcelFilesPath + "myExcelFile.xlsx");

using (ExcelPackage pck = new ExcelPackage())
{
    // Using Existing WorkSheet 1.
    ExcelWorksheet ws = pck.Workbook.Worksheets[1];

    // Loading Data From DataTable Called dt.
    ws.Cells["A1"].LoadFromDataTable(dt, true);

    // If you want to enable auto filter
    ws.Cells[ws.Dimension.Address].AutoFilter = true;

    // Some Formatting
    Color colFromHex = System.Drawing.ColorTranslator.FromHtml("#00B388");
    ws.Cells[ws.Dimension.Address].Style.Fill.PatternType = ExcelFillStyle.Solid;
    ws.Cells[ws.Dimension.Address].Style.Fill.BackgroundColor.SetColor(colFromHex);
    ws.Cells[ws.Dimension.Address].Style.Font.Color.SetColor(Color.White);
    ws.Cells[ws.Dimension.Address].Style.Font.Bold = true;
    ws.Cells["D:K"].Style.Numberformat.Format = "0";
    ws.Cells["M:N"].Style.Numberformat.Format = "mm-dd-yyyy hh:mm:ss";
    ws.Cells[ws.Dimension.Address].AutoFitColumns();

    pck.SaveAs(fi);

}

您可以参考我的项目中的上述代码。我通过提供范围或起始单元格将 DataTable 数据加载到我的 excel 文件中。


推荐阅读