c# - 使用 excel 的服务中的方法未保存并且似乎不会产生异常
问题描述
我的服务中有一些代码有问题。该方法只是创建需要创建的报表的数据表,然后将其写入现有的 excel 文件。问题是它在保存文件时失败。更奇怪的是,它似乎没有发现错误,我不知道为什么。我已经包含了下面的代码。注意:
excel.可见=真;似乎每次都没有使 excel 表可见,所以我无法真正看到 excel 本身发生了什么。我认为它不会变得可见,因为它是一项服务,但我真的不知道。
我知道数据表正在生成输出,因为我有日志(这只是一个文本文件,我可以在其中编写事件和错误)写入单元格值及其位置,并且它从未在 Foreach 循环或 for在里面循环
我知道它在 wb.Save(); 上失败了。因为 Log.WriteLine("WriteTIByEmp 4"); 成功写入文本文件,但 Log.WriteLine("WriteTIByEmp 5"); 才不是。
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);
}
}
解决方案
我也遇到过类似的情况。
注意:虽然使用 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 文件中。
推荐阅读
- .htaccess - 将特定 URL 重定向到另一个子域上的另一个 URL
- javascript - 使用 chart.js 在一页中显示多个图表
- python - PyMonzo 库和使用 Raspberry Pi 3 的 Adafruit_Neopixel 库之间的冲突
- java - Scanner 对象在 while 循环中只执行一次
- python - 如何将纪元时间转换为时间
- azure - Powershell循环直到输出为一行
- c++ - 运行相同解决方案的另一个项目的项目
- ios - IONIC 3 本地通知在带有 FCM 的 IOS 中不起作用
- android - While 循环更新 TextView
- php - 在 Woocommerce 中向管理产品选项设置添加自定义多选字段