如何使用 C# 和 ClosedXML 将新行附加到 Excel 文件?
How to append a new row to an Excel file using C# and ClosedXML?
我应该向现有 Excel 文件追加一个新行。任务由两部分组成:
- 添加到不存在的文件(效果很好)。
- 添加到现有文件(不起作用:它不创建新记录,仅显示 "else" 正文中的旧记录)。
这是我的代码:
private static void ExportToEXCEL(DataTable dt, string paymentStoryPath)
{
if (File.Exists(paymentStoryPath))
{
XLWorkbook currentWorkbook = new XLWorkbook(paymentStoryPath);
IXLWorksheet currentWsh = currentWorkbook.Worksheet("Payment history");
//IXLCell cellForNewData = index.Cell(index.LastRowUsed().RowNumber() + 1, 1);
IXLRow rowForNewData = currentWsh.Row(currentWsh.LastRowUsed().RowNumber()+1);
rowForNewData.InsertRowsBelow(1);
rowForNewData.Value = dt;
currentWorkbook.Save();
}
else
{
//not exist
XLWorkbook wb = new XLWorkbook();
wb.Worksheets.Add(dt, "Payment history");
wb.SaveAs(paymentStoryPath);
}
}
我的代码出了什么问题,我应该更改什么?
要添加 DataTable
使用 InsertTable()
方法:
XLWorkbook currentWorkbook = new XLWorkbook(paymentStoryPath);
IXLWorksheet currentWsh = currentWorkbook.Worksheet("Payment history");
IXLCell cellForNewData = currentWsh.Cell(currentWsh.LastRowUsed().RowNumber() + 1, 1);
cellForNewData.InsertTable(dt);
currentWorkbook.Save();
我从我的一个项目中获得了以下代码,该代码将 DataTable
插入 Excel。
//insert rows below a range from the cell going table rows down
ws.Range(
cell.Address.RowNumber
, cell.Address.ColumnNumber
, cell.Address.RowNumber + DocDataSet.Tables[tableNo].Rows.Count
, cell.Address.ColumnNumber)
.InsertRowsBelow(DocDataSet.Tables[tableNo].Rows.Count);
//InsertData returns a range covering the inserted data
var ra = ws.Cell(cell.Address.RowNumber, cell.Address.ColumnNumber)
.InsertData(DocDataSet.Tables[tableNo].AsEnumerable());
//apply the style of the table token cell to the whole range
ra.Style = cell.Style;
我写它已经有一段时间了,但据我所知,我的想法是创建一个范围来覆盖将要填充的行和列。 Cell
对象有一个 InsertData
方法可以接受任何 IEnumerable
来源。
您可能不需要 ws.Range
行,我正在插入模板,所以我必须先创建 space。
我以@raidri 为例并更进一步,我有一个扩展方法来处理这个问题。
public static class Extensions
{
public static void ToExcelFile(this DataTable dataTable, string filename, string worksheetName = "Sheet1")
{
using(var workbook = new XLWorkbook())
{
workbook.Worksheets.Add(dataTable, worksheetName);
workbook.SaveAs(filename);
}
}
}
使用
myDataTable.ToExcelFile(@"C:\temp\myFile.xlsx");
我应该向现有 Excel 文件追加一个新行。任务由两部分组成:
- 添加到不存在的文件(效果很好)。
- 添加到现有文件(不起作用:它不创建新记录,仅显示 "else" 正文中的旧记录)。
这是我的代码:
private static void ExportToEXCEL(DataTable dt, string paymentStoryPath)
{
if (File.Exists(paymentStoryPath))
{
XLWorkbook currentWorkbook = new XLWorkbook(paymentStoryPath);
IXLWorksheet currentWsh = currentWorkbook.Worksheet("Payment history");
//IXLCell cellForNewData = index.Cell(index.LastRowUsed().RowNumber() + 1, 1);
IXLRow rowForNewData = currentWsh.Row(currentWsh.LastRowUsed().RowNumber()+1);
rowForNewData.InsertRowsBelow(1);
rowForNewData.Value = dt;
currentWorkbook.Save();
}
else
{
//not exist
XLWorkbook wb = new XLWorkbook();
wb.Worksheets.Add(dt, "Payment history");
wb.SaveAs(paymentStoryPath);
}
}
我的代码出了什么问题,我应该更改什么?
要添加 DataTable
使用 InsertTable()
方法:
XLWorkbook currentWorkbook = new XLWorkbook(paymentStoryPath);
IXLWorksheet currentWsh = currentWorkbook.Worksheet("Payment history");
IXLCell cellForNewData = currentWsh.Cell(currentWsh.LastRowUsed().RowNumber() + 1, 1);
cellForNewData.InsertTable(dt);
currentWorkbook.Save();
我从我的一个项目中获得了以下代码,该代码将 DataTable
插入 Excel。
//insert rows below a range from the cell going table rows down
ws.Range(
cell.Address.RowNumber
, cell.Address.ColumnNumber
, cell.Address.RowNumber + DocDataSet.Tables[tableNo].Rows.Count
, cell.Address.ColumnNumber)
.InsertRowsBelow(DocDataSet.Tables[tableNo].Rows.Count);
//InsertData returns a range covering the inserted data
var ra = ws.Cell(cell.Address.RowNumber, cell.Address.ColumnNumber)
.InsertData(DocDataSet.Tables[tableNo].AsEnumerable());
//apply the style of the table token cell to the whole range
ra.Style = cell.Style;
我写它已经有一段时间了,但据我所知,我的想法是创建一个范围来覆盖将要填充的行和列。 Cell
对象有一个 InsertData
方法可以接受任何 IEnumerable
来源。
您可能不需要 ws.Range
行,我正在插入模板,所以我必须先创建 space。
我以@raidri 为例并更进一步,我有一个扩展方法来处理这个问题。
public static class Extensions
{
public static void ToExcelFile(this DataTable dataTable, string filename, string worksheetName = "Sheet1")
{
using(var workbook = new XLWorkbook())
{
workbook.Worksheets.Add(dataTable, worksheetName);
workbook.SaveAs(filename);
}
}
}
使用
myDataTable.ToExcelFile(@"C:\temp\myFile.xlsx");