2017-01-13 15 views
1

このように、列の値が前の行と同じであり、「B3」の値が「B2」と同じである場合に何が必要なのグループ行である:グルーピングExcelの行

enter image description here

私はepplusでC#を使っていますが、アウトラインオプションでこれに似た何かをすることができますが、私の望むものに似ていますが、このオプションにはいくつか欠点があります値に基づいて自動的にグループ化し、さまざまなグループを行うことはできません....

EPPLUSでこれを行うことはできますか? it'sかのうない場合、私はC#にVBAコードを追加することができますか?私はこれを試してみてください:

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ファイルを開くcan't。

EDIT

では、私はグループ機能と相互運用機能を試してみたが、彼は、行列ではなく、グループ化されextrain理由で、これはコードで今推薦し:

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; 
+0

EPPlusはエクセルでは不可能である何かをすることはできません。ただし、ExcelやVBAで何かできるのであれば、EPPlusで実行できます。あなたは列をグループ化するためにVBAを必要としません。例えば、 'sheet.Cells [" A1:D11 "]'は 'Group 'を呼び出すことができるExcelRangeを返します。 –

+0

yesは、 Excelで行うことができることはすべてEEPLUSで行うことができますが、Excelでこれを行う方法はわかりません。このオプションは[データ]タブの小計オプションにあります。 EPPLUSでこれを行う方法を知っているなら、この作業の簡単な例を書いてください。 ** sheet.Cells ["A1:D11"] **グループオプションが表示されていないと、グループ名が存在することがわかりますが、どのように動作するのか分かりません。 – Ion

答えて

2

私は、これはすでに答えが、私は、あなたは確かに行うことができますが、手動で合計細胞を作成する必要がありますEPPlusの方法を提供するだろう考え出している参照してください。

[TestMethod] 
public void Row_Grouping_Test() 
{ 
    //http://stackoverflow.com/questions/41636336/grouping-excel-rows-with-epplus 

    //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 = "SUM(B2:B10)"; 
     worksheet.Cells["C11"].Formula = "SUM(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(); 
    } 
} 

は次のようになりますどの:

enter image description here

+0

パーフェクト、ちょうど私が必要なものです – Ion

0

私は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; 
     } 
    } 
} 
+0

回答をお寄せいただきありがとうございます。質問を編集しました。私はgroup()オプションを使用してinteropを使用しますが、Excelマージ列ではなく、行、 助けてくれますか? – Ion

+1

Interopには、サーバーにExcelをインストールする必要があります。 EPPlusはxlsxファイルを直接生成します。 –

+0

@lon私の行をグループ化する方法の解説を参照してください。// 'Ws.Rows [" 4:7 "]グループ();' – jonathana

関連する問題