我该如何在C#中使用EPPlus扩展现有的表格?我的程序先创建一个只有两行的表格,之后不断地添加更多行。但是在 ExcelTable
中似乎找不到任何改变表格大小的方式。是否有专门的方法来实现此功能,还是需要使用其他替代方法?
编辑:好的,我想澄清一下。我的问题是:如何将现有的ExcelTable扩展(添加更多行)?
我该如何在C#中使用EPPlus扩展现有的表格?我的程序先创建一个只有两行的表格,之后不断地添加更多行。但是在 ExcelTable
中似乎找不到任何改变表格大小的方式。是否有专门的方法来实现此功能,还是需要使用其他替代方法?
编辑:好的,我想澄清一下。我的问题是:如何将现有的ExcelTable扩展(添加更多行)?
很遗憾,没有直接的方法。不太确定为什么,但EPPlus的开发人员选择将ExcelTable.Address
属性设置为只读。所以最明显的选择是创建一个新表,复制所有属性(假设你知道所有需要的属性),然后删除旧表。这并不是非常理想,因为你可能会漏掉一些内容。
但我看到另外两种方法 - 也不是特别好看但比复制/删除要好。假设有这样一张表:
选项1:你可以fork EPPlus源代码,并使所需属性变为可读/写。你可以在文件ExcelTable.cs
中进行更改:
public ExcelAddressBase Address
{
get
{
return _address;
}
internal set //REMOVE internal KEYWORD
{
_address = value;
SetXmlNodeString("@ref",value.Address);
WriteAutoFilter(ShowTotal);
}
}
通过删除internal
关键词。但是当然,您需要小心,这样做不会在途中破坏其他东西。有了这个,您可以做如下操作:
var fileInfo = new FileInfo(@"c:\temp\Expand_Table.xlsx");
using (var pck = new ExcelPackage(fileInfo))
{
var workbook = pck.Workbook;
var worksheet = workbook.Worksheets.First();
//Added 11th data row assuming the table is from A1 to C11 (Header row + 10 data rows)
worksheet.Cells["A12"].Value = 10;
worksheet.Cells["B12"].Value = 100;
worksheet.Cells["C12"].Value = Path.GetRandomFileName();
var tbl = worksheet.Tables["TestTable1"];
var oldaddy = tbl.Address;
var newaddy = new ExcelAddressBase(oldaddy.Start.Row, oldaddy.Start.Column, oldaddy.End.Row + 1, oldaddy.End.Column);
tbl.Address = newaddy;
pck.Save();
}
选项2是更安全的选择,但使用字符串替换XML会更加"脏". 我们不能假设只有一个地址的引用,因为例如AutoFilter可能已经打开。这是在Excel中创建表格时默认XML的样子(请注意对地址的两个引用):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<table xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" id="3" name="TestTable1" displayName="TestTable1" ref="A1:C11" totalsRowShown="0">
<autoFilter ref="A1:C11" />
<tableColumns count="3">
<tableColumn id="1" name="Col1" />
<tableColumn id="2" name="Col2" />
<tableColumn id="3" name="Col3" />
</tableColumns>
<tableStyleInfo name="TableStyleMedium2" showFirstColumn="0" showLastColumn="0" showRowStripes="1" showColumnStripes="0" />
</table>
因此,我们可以像这样进行字符串替换:
var fileInfo = new FileInfo(@"c:\temp\Expand_Table.xlsx");
using (var pck = new ExcelPackage(fileInfo))
{
var workbook = pck.Workbook;
var worksheet = workbook.Worksheets.First();
//Added 11th data row assuming the table is from A1 to C11 (Header row + 10 data rows)
worksheet.Cells["A12"].Value = 10;
worksheet.Cells["B12"].Value = 100;
worksheet.Cells["C12"].Value = Path.GetRandomFileName();
var tbl = worksheet.Tables["TestTable1"];
var oldaddy = tbl.Address;
var newaddy = new ExcelAddressBase(oldaddy.Start.Row, oldaddy.Start.Column, oldaddy.End.Row + 1, oldaddy.End.Column);
//Edit the raw XML by searching for all references to the old address
tbl.TableXml.InnerXml = tbl.TableXml.InnerXml.Replace(oldaddy.ToString(), newaddy.ToString());
pck.Save();
}
ExcelTable
。 - dub styleeTemplate.xlsx
Report_with_Epplus.xlsx
public void xlsEpplus()
{
try
{
TimeSpan stop;
TimeSpan start = new TimeSpan(DateTime.Now.Ticks);
Database DB = new Database();
DB.msConect();
string sql = "SELECT * FROM table_test";
DataTable dt_tab = DB.xSqlMs(sql);
string Template = "D:\\Plantillas\\Template.xlsx";
string filePath = "D:\\Plantillas\\Report_with_Epplus.xlsx";
File.Copy(Template, filePath, true);
ExcelPackage pck = new ExcelPackage();
pck.Load(new FileStream(Template, FileMode.OpenOrCreate));
ExcelWorksheet ws = pck.Workbook.Worksheets.First();
var a = ws.Cells["A1"].Value;
int i = 2;
ws.InsertRow(i, dt_tab.Rows.Count);
ws.Cells["A2"].LoadFromDataTable(dt_tab, true);
pck.SaveAs(new FileInfo(filePath));
stop = new TimeSpan(DateTime.Now.Ticks);
Console.WriteLine("xlsEpplus_While:" + stop.Subtract(start));
}
catch (Exception ex)
{
//
Console.WriteLine("ERROR: " + ex.Message);
}
}