在 EPPlus C# 中展开 table
Expand a table in EPPlus C#
有什么方法可以在 C# 的 EPPlus 中扩展现有的 table。我的程序的工作方式是创建只有 2 行的 table 并不断添加更多行。我似乎无法在 ExcelTable
中找到任何类型的调整大小方法。是否有专门的方法,或者我需要使用某种替代方法?
编辑: 好吧,我只是想澄清一下。 我已经在使用 EPPlus 制作 ExcelTable。我的问题是:如何使现有的 ExcelTable 更大(添加更多行)?
遗憾的是,没有直接的方法。不太清楚为什么,但 EPPlus 的开发人员选择只让 ExcelTable.Address
属性 就绪。因此,最明显的选择是创建一个新的 table,复制所有属性(假设您知道所有需要的属性)并删除旧的。不是很理想,因为你可能会错过一些东西。
但我看到另外两个 - 下一个也非常漂亮,但比 copy/delete 更好。假设 table 像这样:
选项 1 您可以分叉 EPPlus 源代码并制作 属性 所需的 read/write。您可以在文件 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 将是更安全的选项,但大多数 "dirty" 通过在 XML 上使用字符串替换。我们不能假设只有一个地址引用,因为,例如,可以打开自动筛选器。这是在 excel 中创建 table 时默认 XML 的样子(注意地址的 2 个引用):
<?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();
}
这个问题已经有一年了,但希望有人仍然需要答案,有一个直接的解决方案,虽然由于 EEPlus 中的一个错误而没有完成(我正在使用 v4.1)。
ExcelWorksheet 有一个 InsertRow(Int32, Int32, Int32) 方法。如果在属于 table 的区域中插入行,table 也会展开。只需使用它的地址 属性 即可获得边界。只需确保在 table.
的第一行和最后一行之间插入
我知道有一个与单元格验证相关的缺陷:即使您使用可以从现有行复制样式的重载,也不会复制验证。更糟糕的是,验证保留在原来的位置,并且不会随单元格一起移动。我没有测试过,但我相信如果验证有一个范围而不是一个单元格作为目标,那么如果您将行插入该范围,该范围也会扩展。
如果您希望扩展工作表中现有数据的 table,这对您没有帮助 - 但您仍然可以移动行。
而且当你有很多 table 并排时(这是一场噩梦)。
我遇到了同样的问题,我找到了一种非常快速的方法来将 SQL 数据 Table 转储到 Excel Table.
18004 行仅需 04.2 秒
我的模板包含在扩展 table 时继承到新行的公式。
Template.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);
}
}
有什么方法可以在 C# 的 EPPlus 中扩展现有的 table。我的程序的工作方式是创建只有 2 行的 table 并不断添加更多行。我似乎无法在 ExcelTable
中找到任何类型的调整大小方法。是否有专门的方法,或者我需要使用某种替代方法?
编辑: 好吧,我只是想澄清一下。 我已经在使用 EPPlus 制作 ExcelTable。我的问题是:如何使现有的 ExcelTable 更大(添加更多行)?
遗憾的是,没有直接的方法。不太清楚为什么,但 EPPlus 的开发人员选择只让 ExcelTable.Address
属性 就绪。因此,最明显的选择是创建一个新的 table,复制所有属性(假设您知道所有需要的属性)并删除旧的。不是很理想,因为你可能会错过一些东西。
但我看到另外两个 - 下一个也非常漂亮,但比 copy/delete 更好。假设 table 像这样:
选项 1 您可以分叉 EPPlus 源代码并制作 属性 所需的 read/write。您可以在文件 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 将是更安全的选项,但大多数 "dirty" 通过在 XML 上使用字符串替换。我们不能假设只有一个地址引用,因为,例如,可以打开自动筛选器。这是在 excel 中创建 table 时默认 XML 的样子(注意地址的 2 个引用):
<?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();
}
这个问题已经有一年了,但希望有人仍然需要答案,有一个直接的解决方案,虽然由于 EEPlus 中的一个错误而没有完成(我正在使用 v4.1)。
ExcelWorksheet 有一个 InsertRow(Int32, Int32, Int32) 方法。如果在属于 table 的区域中插入行,table 也会展开。只需使用它的地址 属性 即可获得边界。只需确保在 table.
的第一行和最后一行之间插入我知道有一个与单元格验证相关的缺陷:即使您使用可以从现有行复制样式的重载,也不会复制验证。更糟糕的是,验证保留在原来的位置,并且不会随单元格一起移动。我没有测试过,但我相信如果验证有一个范围而不是一个单元格作为目标,那么如果您将行插入该范围,该范围也会扩展。
如果您希望扩展工作表中现有数据的 table,这对您没有帮助 - 但您仍然可以移动行。 而且当你有很多 table 并排时(这是一场噩梦)。
我遇到了同样的问题,我找到了一种非常快速的方法来将 SQL 数据 Table 转储到 Excel Table.
18004 行仅需 04.2 秒
我的模板包含在扩展 table 时继承到新行的公式。
Template.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);
}
}