NPOI Bar/Column 图表?
NPOI Bar/Column Chart?
我需要在 excel 上创建一个简单的条形图并将其导出。
在 NPOI 的 repo 上搜索示例并通过代码,我看到可以创建折线图和散点图。
我正在考虑使用已创建的图表创建一个 excel 模板,因此修改它们的轴。
我需要的只是确认无法使用 NPOI 创建 bar/column 图表。
提前致谢!
好的,在调查 NPOI github 问题后,我发现这是可能的。但它有一些限制。
我无法在图表上设置小数,但在对 Java 线程的数据格式进行了一些调查后,我能够通过更改当前线程文化来解决问题。
下面的代码示例:
private void CreateChart(int columnQtt, int rowIndex, int tipoId, string currentTipo, ISheet sheet, int startDataRow)
{
XSSFDrawing drawing = (XSSFDrawing)sheet.CreateDrawingPatriarch();
XSSFClientAnchor anchor = (XSSFClientAnchor)drawing.CreateAnchor(0, 0, 0, 0, columnQtt + 1, startDataRow - 2, columnQtt + 10, startDataRow + 12);
XSSFChart chart = (XSSFChart)drawing.CreateChart(anchor);
IBarChartData<string, double> barChartData = chart.ChartDataFactory.CreateBarChartData<string, double>();
IChartLegend legend = chart.GetOrCreateLegend();
legend.Position = LegendPosition.Bottom;
IChartAxis bottomAxis = chart.ChartAxisFactory.CreateCategoryAxis(AxisPosition.Bottom);
bottomAxis.MajorTickMark = AxisTickMark.None;
IValueAxis leftAxis = chart.ChartAxisFactory.CreateValueAxis(AxisPosition.Left);
leftAxis.Crosses = AxisCrosses.AutoZero;
leftAxis.SetCrossBetween(AxisCrossBetween.Between);
int endDataRow = rowIndex - 1;
IChartDataSource<string> categoryAxis = DataSources.FromStringCellRange(sheet, new CellRangeAddress(startDataRow, endDataRow, 0, 0));
IChartDataSource<double> valueAxis = DataSources.FromNumericCellRange(sheet, new CellRangeAddress(startDataRow, endDataRow, columnQtt - 1, columnQtt - 1));
var serie = barChartData.AddSeries(categoryAxis, valueAxis);
serie.SetTitle(currentTipo);
chart.Plot(barChartData, bottomAxis, leftAxis);
}
我需要在 excel 上创建一个简单的条形图并将其导出。 在 NPOI 的 repo 上搜索示例并通过代码,我看到可以创建折线图和散点图。
我正在考虑使用已创建的图表创建一个 excel 模板,因此修改它们的轴。
我需要的只是确认无法使用 NPOI 创建 bar/column 图表。
提前致谢!
好的,在调查 NPOI github 问题后,我发现这是可能的。但它有一些限制。
我无法在图表上设置小数,但在对 Java 线程的数据格式进行了一些调查后,我能够通过更改当前线程文化来解决问题。
下面的代码示例:
private void CreateChart(int columnQtt, int rowIndex, int tipoId, string currentTipo, ISheet sheet, int startDataRow)
{
XSSFDrawing drawing = (XSSFDrawing)sheet.CreateDrawingPatriarch();
XSSFClientAnchor anchor = (XSSFClientAnchor)drawing.CreateAnchor(0, 0, 0, 0, columnQtt + 1, startDataRow - 2, columnQtt + 10, startDataRow + 12);
XSSFChart chart = (XSSFChart)drawing.CreateChart(anchor);
IBarChartData<string, double> barChartData = chart.ChartDataFactory.CreateBarChartData<string, double>();
IChartLegend legend = chart.GetOrCreateLegend();
legend.Position = LegendPosition.Bottom;
IChartAxis bottomAxis = chart.ChartAxisFactory.CreateCategoryAxis(AxisPosition.Bottom);
bottomAxis.MajorTickMark = AxisTickMark.None;
IValueAxis leftAxis = chart.ChartAxisFactory.CreateValueAxis(AxisPosition.Left);
leftAxis.Crosses = AxisCrosses.AutoZero;
leftAxis.SetCrossBetween(AxisCrossBetween.Between);
int endDataRow = rowIndex - 1;
IChartDataSource<string> categoryAxis = DataSources.FromStringCellRange(sheet, new CellRangeAddress(startDataRow, endDataRow, 0, 0));
IChartDataSource<double> valueAxis = DataSources.FromNumericCellRange(sheet, new CellRangeAddress(startDataRow, endDataRow, columnQtt - 1, columnQtt - 1));
var serie = barChartData.AddSeries(categoryAxis, valueAxis);
serie.SetTitle(currentTipo);
chart.Plot(barChartData, bottomAxis, leftAxis);
}