使用 EPPLUS 对 excel 行进行分组
grouping excel rows with EPPLUS
我需要的是当行的值与前一行相同时对行进行分组,"B3"的值与"B2"相同,如下所示:
我在 epplus 中使用 c#,我知道如何使用 outline 选项做类似的事情,并且与我想要的类似,但是这个选项有一些缺点,比如没有不能根据值自动分组,不能进行各种分组....
可以用 EPPLUS 做到这一点吗?如果不可行,我如何将 vba 代码添加到 C#?我试试这个:
StringBuilder vbaCode = new StringBuilder();
vbaCode.AppendLine("Sheets('Sheet1').Activate");
vbaCode.AppendLine("Range('A1: D11').Select");
vbaCode.AppendLine("Selection.Subtotal GroupBy:= 1, Function:= xlSum, TotalList:= Array(2, 3),Replace:= True, PageBreaks:= False, SummaryBelowData:= True");
pck.Save();
但不起作用,我无法打开 Excel 文件。
编辑
我现在使用 sugested 尝试使用 group 函数进行 Interop,但出于额外原因,他对列而不是行进行分组,这是代码:
var ExApp = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbooks Wbs = ExApp.Workbooks;
Microsoft.Office.Interop.Excel.Workbook Wb = Wbs.Open(fi.FullName.ToString());
Microsoft.Office.Interop.Excel.Sheets wss = Wb.Worksheets;
Microsoft.Office.Interop.Excel.Worksheet Ws = (Microsoft.Office.Interop.Excel.Worksheet)wss.get_Item("Sheet1");
Ws.Range["A6:A10"].Group();
Ws.Outline.SummaryRow =Microsoft.Office.Interop.Excel.XlSummaryRow.xlSummaryAbove;
ExApp.Visible = true;
我对EPPLUS库不熟悉。
但是您可以使用 Microsoft.Office.Interop.Excel
命名空间非常轻松地完成该任务。
而且你可以像使用 Vba- 那样做(使用 Merge()
方法)
请注意,您需要将该名称空间的引用添加到您的项目中。
这是一个例子:
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Office.Interop.Excel;
namespace WindowsFormsApplication32
{
public partial class Form1 : Form
{
public Microsoft.Office.Interop.Excel.Application ExApp;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
ExApp = new Microsoft.Office.Interop.Excel.Application();
// CREATE A NEW WORKBOOK (you can also open existing workbook using the Open() method)
Microsoft.Office.Interop.Excel.Workbook Wb = ExApp.Workbooks.Add();
// SET WORKSHEET
Microsoft.Office.Interop.Excel.Worksheet Ws = Wb.Worksheets.Add();
// MERGE CELLS (the answer to your question)
Ws.Range["A1:G5"].Merge();
// GROUP ROWS (the final answer to your question)
Ws.Rows["4:7"].Group();
ExApp.Visible = true;
}
}
}
我看到这已经得到解答,但我想我会提供一种 EPPlus 方式,您当然可以这样做,但您确实需要手动创建求和单元格:
[TestMethod]
public void Row_Grouping_Test()
{
//
//Throw in some data
var datatable = new DataTable("tblData");
datatable.Columns.AddRange(new[]
{
new DataColumn("Header", typeof (string)), new DataColumn("Col1", typeof (int)), new DataColumn("Col2", typeof (int)), new DataColumn("Col3", typeof (object))
});
for (var i = 0; i < 10; i++)
{
var row = datatable.NewRow();
row[0] = $"Header {i}"; row[1] = i; row[2] = i * 10; row[3] = Path.GetRandomFileName(); datatable.Rows.Add(row);
}
//Create a test file
var fi = new FileInfo(@"c:\temp\Row_Grouping_Test.xlsx");
if (fi.Exists)
fi.Delete();
using (var pck = new ExcelPackage(fi))
{
var worksheet = pck.Workbook.Worksheets.Add("Sheet1");
worksheet.Cells.LoadFromDataTable(datatable, false);
worksheet.Cells["A11"].Value = "TOTAL";
worksheet.Cells["B11"].Formula = "SUBTOTAL(9,B2:B10)";
worksheet.Cells["C11"].Formula = "SUBTOTAL(9,C2:C10)";
worksheet.Row(11).Style.Font.Bold = true;
//Row Group 1 (start with 1 since row index is 1-based)
for (var i = 1; i <= datatable.Rows.Count; i++)
worksheet.Row(i).OutlineLevel = 1;
pck.Save();
}
}
看起来像这样:
我需要的是当行的值与前一行相同时对行进行分组,"B3"的值与"B2"相同,如下所示:
我在 epplus 中使用 c#,我知道如何使用 outline 选项做类似的事情,并且与我想要的类似,但是这个选项有一些缺点,比如没有不能根据值自动分组,不能进行各种分组....
可以用 EPPLUS 做到这一点吗?如果不可行,我如何将 vba 代码添加到 C#?我试试这个:
StringBuilder vbaCode = new StringBuilder();
vbaCode.AppendLine("Sheets('Sheet1').Activate");
vbaCode.AppendLine("Range('A1: D11').Select");
vbaCode.AppendLine("Selection.Subtotal GroupBy:= 1, Function:= xlSum, TotalList:= Array(2, 3),Replace:= True, PageBreaks:= False, SummaryBelowData:= True");
pck.Save();
但不起作用,我无法打开 Excel 文件。
编辑
我现在使用 sugested 尝试使用 group 函数进行 Interop,但出于额外原因,他对列而不是行进行分组,这是代码:
var ExApp = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbooks Wbs = ExApp.Workbooks;
Microsoft.Office.Interop.Excel.Workbook Wb = Wbs.Open(fi.FullName.ToString());
Microsoft.Office.Interop.Excel.Sheets wss = Wb.Worksheets;
Microsoft.Office.Interop.Excel.Worksheet Ws = (Microsoft.Office.Interop.Excel.Worksheet)wss.get_Item("Sheet1");
Ws.Range["A6:A10"].Group();
Ws.Outline.SummaryRow =Microsoft.Office.Interop.Excel.XlSummaryRow.xlSummaryAbove;
ExApp.Visible = true;
我对EPPLUS库不熟悉。
但是您可以使用 Microsoft.Office.Interop.Excel
命名空间非常轻松地完成该任务。
而且你可以像使用 Vba- 那样做(使用 Merge()
方法)
请注意,您需要将该名称空间的引用添加到您的项目中。
这是一个例子:
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Office.Interop.Excel;
namespace WindowsFormsApplication32
{
public partial class Form1 : Form
{
public Microsoft.Office.Interop.Excel.Application ExApp;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
ExApp = new Microsoft.Office.Interop.Excel.Application();
// CREATE A NEW WORKBOOK (you can also open existing workbook using the Open() method)
Microsoft.Office.Interop.Excel.Workbook Wb = ExApp.Workbooks.Add();
// SET WORKSHEET
Microsoft.Office.Interop.Excel.Worksheet Ws = Wb.Worksheets.Add();
// MERGE CELLS (the answer to your question)
Ws.Range["A1:G5"].Merge();
// GROUP ROWS (the final answer to your question)
Ws.Rows["4:7"].Group();
ExApp.Visible = true;
}
}
}
我看到这已经得到解答,但我想我会提供一种 EPPlus 方式,您当然可以这样做,但您确实需要手动创建求和单元格:
[TestMethod]
public void Row_Grouping_Test()
{
//
//Throw in some data
var datatable = new DataTable("tblData");
datatable.Columns.AddRange(new[]
{
new DataColumn("Header", typeof (string)), new DataColumn("Col1", typeof (int)), new DataColumn("Col2", typeof (int)), new DataColumn("Col3", typeof (object))
});
for (var i = 0; i < 10; i++)
{
var row = datatable.NewRow();
row[0] = $"Header {i}"; row[1] = i; row[2] = i * 10; row[3] = Path.GetRandomFileName(); datatable.Rows.Add(row);
}
//Create a test file
var fi = new FileInfo(@"c:\temp\Row_Grouping_Test.xlsx");
if (fi.Exists)
fi.Delete();
using (var pck = new ExcelPackage(fi))
{
var worksheet = pck.Workbook.Worksheets.Add("Sheet1");
worksheet.Cells.LoadFromDataTable(datatable, false);
worksheet.Cells["A11"].Value = "TOTAL";
worksheet.Cells["B11"].Formula = "SUBTOTAL(9,B2:B10)";
worksheet.Cells["C11"].Formula = "SUBTOTAL(9,C2:C10)";
worksheet.Row(11).Style.Font.Bold = true;
//Row Group 1 (start with 1 since row index is 1-based)
for (var i = 1; i <= datatable.Rows.Count; i++)
worksheet.Row(i).OutlineLevel = 1;
pck.Save();
}
}
看起来像这样: