私の質問は、SOですでに尋ねられている他の質問と非常に似ていることは知っていますが、満足のいく答えが見つからないので、運試しをします。
NPOIライブラリを使用してExcelスプレッドシートにグラフを生成できるかどうかを知っています。
私はそのブログを読みましたが、既存のテンプレートがすでに存在する例を示しています。「ゼロから」それは可能ではありませんか?
さらに調査した結果、ここで答えを得ました:http://npoi.codeplex.com/releases/view/19351
サポートされていない機能: Excel チャート
そのため、Leniel がブログで説明しているように、プライマリ スプレッドシートをテンプレートとして使用する必要があります。
どうもありがとうレニエル!:)
チャートを使用したNPOIの例については、 http ://www.zachhunter.com/2010/05/npoi-excel-template/を参照してください。
自動化せずにグラフを作成する別の解決策は、サード パーティのコンポーネントを使用することです。たとえば、このSmartXLS for .Netでは、グラフ/ピボットテーブルを最初から作成できます。
私も同じ問題を抱えていたので、これを回避する方法を見つけました。NPOI の C# ポートを使用してグラフを生成する良い例はあまりありません。ほとんどの人は、テンプレートと広告を使用して結果を変更していると思います。
必要なグラフの種類に応じて、さまざまな方法論を使用する必要があります。私の例は、2.5.2 で動作する私自身のコードから直接盗まれたため、sheet などの変数の定義が欠落している可能性があるため、自分でそれらを埋める必要があります。
棒グラフと折れ線グラフの場合、次のような単純なものを使用できます。
IDrawing drawing = sheet.CreateDrawingPatriarch ( );
/* Define anchor points in the worksheet to position the chart */
IClientAnchor anchor = drawing.CreateAnchor ( 0, 0, 0, 0, 0, 3, 10, 23 );
row = row + 23;
/* Create the chart object based on the anchor point */
IChart barChart = drawing.CreateChart ( anchor );
/* Define legends for the line chart and set the position of the legend */
IChartLegend legend = barChart.GetOrCreateLegend ( );
legend.Position = LegendPosition.Bottom;
/* Create data for the chart */
IBarChartData<double, double> data = barChart.ChartDataFactory.CreateBarChartData<double, double> ( );
/* Define chart AXIS */
IChartAxis bottomAxis = barChart.ChartAxisFactory.CreateCategoryAxis ( AxisPosition.Bottom );
IValueAxis leftAxis = barChart.ChartAxisFactory.CreateValueAxis ( AxisPosition.Left );
leftAxis.Crosses = AxisCrosses.AutoZero;
/* Define Data sources for the chart */
/* Set the right cell range that contain values for the chart */
/* Pass the worksheet and cell range address as inputs */
/* Cell Range Address is defined as First row, last row, first column, last column */
int iDataPoints = dataSet.Tables[ "_CHART" ].Rows.Count + 1;
//Defines the rows/columns used for X-Axis data
IChartDataSource<double> xs = DataSources.FromNumericCellRange ( sheetChart, new CellRangeAddress ( 2, iDataPoints, 0, 0 ) );
//Defines the rows/columns used for the line data
IChartDataSource<double> ys1 = DataSources.FromNumericCellRange ( sheetChart, new CellRangeAddress ( 2, iDataPoints, 1, 1 ) );
/* Add chart data sources as data to the chart */
data.AddSeries ( xs, ys1 );
/* Plot the chart with the inputs from data and chart axis */
barChart.Plot ( data, new IChartAxis[] { bottomAxis, leftAxis } );
円グラフの場合、必要なプロパティ/メソッドが公開されていないことがわかったため、これは少し難しくなりました。ただし、次のようなものを使用してこの作業を行うことができました。
/* At the end of this step, we have a worksheet with test data, that we want to write into a chart */
/* Create a drawing canvas on the worksheet */
IDrawing drawing = sheet.CreateDrawingPatriarch ( );
/* Define anchor points in the worksheet to position the chart */
IClientAnchor anchor = drawing.CreateAnchor ( 0, 0, 0, 0, 0, 3, 10, 23 );
row = row + 23;
/* Create the chart object based on the anchor point */
IChart pieChart = drawing.CreateChart ( anchor );
XSSFChart xssfChart = (XSSFChart) pieChart;
MethodInfo dynMethod = xssfChart.GetType ( ).GetMethod ( "GetCTChart", BindingFlags.NonPublic | BindingFlags.Instance );
object oCTChart = dynMethod.Invoke ( xssfChart, null );
CT_Chart ctChart = (CT_Chart) oCTChart;
//CT_PlotArea plotArea = xssfChart.GetCTChart ( ).plotArea == null ? xssfChart.GetCTChart ( ).AddNewPlotArea ( ) : xssfChart.GetCTChart ( ).plotArea;
CT_PlotArea plotArea = ctChart.plotArea == null ? ctChart.AddNewPlotArea ( ) : ctChart.plotArea;
//plotArea.
var ctpieChart = plotArea.AddNewPie3DChart ( );
//CT_Pie3DChart ctpieChart = plotArea.AddNewPie3DChart ( );
CT_Boolean bVaryColor = new CT_Boolean ( );
bVaryColor.val = 1;
ctpieChart.varyColors = bVaryColor; // .AddNewVaryColors ( ).val = 1;// addNewVaryColors ( ).setVal ( true );
//xssfChart. ( this.title );
IChartDataSource<double> xs = DataSources.FromNumericCellRange ( sheetChart, new CellRangeAddress ( 2, iDataPoints, 0, 0 ) );
//Defines the rows/columns used for the line data
IChartDataSource<double> ys1 = DataSources.FromNumericCellRange ( sheetChart, new CellRangeAddress ( 2, iDataPoints, 1, 1 ) );
String axisDataRange = new CellRangeAddress ( 2, iDataPoints, 0, 0 ).FormatAsString ( sheetChart.SheetName, true );
String numDataRange = new CellRangeAddress ( 2, iDataPoints, 1, 1 ).FormatAsString ( sheetChart.SheetName, true );
CT_UnsignedInt uIval = new CT_UnsignedInt ( );
uIval.val = 0;
//Pie Chart Series
ctpieChart.ser = new List<CT_PieSer> ( );
CT_PieSer ser = new CT_PieSer ( ); //.AddNewSer ( );
ser.idx = uIval;
ser.order = uIval;
//Create category section
ser.cat = new CT_AxDataSource ( );
ser.cat.strRef = new CT_StrRef ( );
ser.cat.strRef.strCache = new CT_StrData ( );
ser.cat.strRef.f = axisDataRange;
CT_UnsignedInt uIRange = new CT_UnsignedInt ( );
uIRange.val = (uint) dataSet.Tables[ "_CHART" ].Rows.Count;
ser.cat.strRef.strCache.ptCount = uIRange;
//Create value section
ser.val = new CT_NumDataSource ( );
ser.val.numRef = new CT_NumRef ( );
ser.val.numRef.f = numDataRange;
ser.val.numRef.numCache = new CT_NumData ( );
ser.val.numRef.numCache.formatCode = "General";
ser.val.numRef.numCache.ptCount = uIRange;
//Create Pts array
ser.dPt = new List<CT_DPt> ( );
//Create Category Pts
ser.cat.strRef.strCache.pt = new List<CT_StrVal> ( );
//Create Value Pts
ser.val.numRef.numCache.pt = new List<CT_NumVal> ( );
//Create Chart Styles/Settings
ser.dLbls = new CT_DLbls ( );
ser.dLbls.spPr = new CT_ShapeProperties ( );
ser.dLbls.spPr.noFill = new NPOI.OpenXmlFormats.Dml.CT_NoFillProperties ( );
ser.dLbls.spPr.ln = new NPOI.OpenXmlFormats.Dml.CT_LineProperties ( );
ser.dLbls.spPr.ln.noFill = new NPOI.OpenXmlFormats.Dml.CT_NoFillProperties ( );
ser.dLbls.showSerName = new CT_Boolean ( ) { val = 0 };
ser.dLbls.showPercent = new CT_Boolean ( ) { val = 0 };
//Add the series
ctpieChart.ser.Add ( ser );
//Loop through points and add to arrays
for ( int iPt = 0; iPt < dataSet.Tables[ "_CHART" ].Rows.Count; iPt++ )
{
CT_UnsignedInt uIPt = new CT_UnsignedInt ( );
uIPt.val = (uint) iPt;
//Create Pt
CT_DPt oPt = new CT_DPt ( );
oPt.idx = uIPt;
ser.dPt.Add ( oPt );
//Create Label Pt
CT_StrVal cPt = new CT_StrVal ( );
cPt.idx = (uint) iPt;
cPt.v = dataSet.Tables[ "_CHART" ].Rows[ iPt ][ "Label" ].ToString ( );
ser.cat.strRef.strCache.pt.Add ( cPt );
//Create Value Pt
CT_NumVal vPt = new CT_NumVal ( );
vPt.idx = (uint) iPt;
vPt.v = dataSet.Tables[ "_CHART" ].Rows[ iPt ][ "Value" ].ToString ( );
ser.val.numRef.numCache.pt.Add ( vPt );
}