ホーム>source

私はApache-poiの初心者です。Apache-poiを使用してデータをExcelスプレッドシートにエクスポートするJavaプロジェクトに取り組んでいます。現在、固定値で円グラフを描くことができます。
私は Apache POI を使用してJavaで円グラフを作成する必要があります 、シートから読み取ることなく、リストのシリーズのカスタム値を使用します。

私が試したコード例は以下です。

<前>ウィズウィズ

以下は私のExcelスナップショットです

問題はここに値をシートに設定してからチャートにフェッチすることです。テーブルを作成したくありません。値をリストとして直接挿入したいだけです(動的に変更できるため)。 つまり
セルから値をフェッチしている行の下ではなく、 import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xddf.usermodel.chart.LegendPosition; import org.apache.poi.xddf.usermodel.chart.XDDFChartData; import org.apache.poi.xddf.usermodel.chart.XDDFChartLegend; import org.apache.poi.xddf.usermodel.chart.XDDFDataSource; import org.apache.poi.xddf.usermodel.chart.XDDFDataSourcesFactory; import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource; import org.apache.poi.xddf.usermodel.chart.XDDFPieChartData; import org.apache.poi.xssf.usermodel.XSSFChart; import org.apache.poi.xssf.usermodel.XSSFClientAnchor; import org.apache.poi.xssf.usermodel.XSSFDrawing; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class PieChartSecond { public static void main(String[] args) throws FileNotFoundException, IOException { try (XSSFWorkbook wb = new XSSFWorkbook()) { XSSFSheet sheet = wb.createSheet("CountryPieChart"); // Create row and put some cells in it. Rows and cells are 0 based. Row row = sheet.createRow((short) 0); Cell cell = row.createCell((short) 0); cell.setCellValue("Russia("+17098242+")" ); cell = row.createCell((short) 1); cell.setCellValue("Canada(" + 9984670 +")" ); cell = row.createCell((short) 2); cell.setCellValue("USA(" +9826675+")" ); row = sheet.createRow((short) 1); cell = row.createCell((short) 0); cell.setCellValue(17098242); cell = row.createCell((short) 1); cell.setCellValue(9984670); cell = row.createCell((short) 2); cell.setCellValue(9826675); XSSFDrawing drawing = sheet.createDrawingPatriarch(); XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 4, 7, 20); XSSFChart chart = drawing.createChart(anchor); chart.setTitleText("Countries"); chart.setTitleOverlay(false); XDDFChartLegend legend = chart.getOrAddLegend(); legend.setPosition(LegendPosition.TOP_RIGHT); XDDFDataSource<String> countries = XDDFDataSourcesFactory.fromStringCellRange(sheet, new CellRangeAddress(0, 0, 0, 2)); XDDFNumericalDataSource<Double> values = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, 2)); // XDDFChartData data = chart.createData(ChartTypes.PIE, null, null); XDDFChartData data = new XDDFPieChartData(chart.getCTChart().getPlotArea().addNewPieChart()); data.setVaryColors(true); data.setVaryColors(true); data.addSeries(countries, values); chart.plot(data); // Write output to an excel file try (FileOutputStream fileOut = new FileOutputStream("pie-chart-countries.xlsx")) { wb.write(fileOut); } } } } からフェッチする必要があります国(国のリスト)& List<String> 値を List<Double> に設定します

<前>ウィズウィズ

値はDbの変更に従って変化し続けるので、これを達成するための任意の方法です。

data.addSeries(countries, values)
あなたの答え
  • 解決した方法 # 1

    XDDFDataSourcesFactoryは、配列からのデータソースの作成も提供します。しかし、それは主に Word でグラフを作成するためのものです  または PowerPoint  埋め込まれた Excel にデータソースを保持します   XWPFChart の作成中にその配列から内部的に作成されたシート または XSLFChart

    ウィズウィズ  スプレッドシートでは、シートのセルからグラフデータソースを取得する必要があります。たぶん、非表示のシートからではなく、配列からではない。

    しかしもちろん可能です。

    XSSFChart の使用例 。

    円グラフの場合:

    <前>ウィズウィズ

    そして棒グラフの場合:

    <前>ウィズウィズ

    これらのグラフは、文字列リテラル式の形式で配列としてデータを保持します。 apache poi 4.1.1 など  そして import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xddf.usermodel.*; import org.apache.poi.xddf.usermodel.chart.*; import org.apache.poi.xssf.usermodel.*; public class PieChartFromArray { public static void main(String[] args) throws IOException { try (XSSFWorkbook wb = new XSSFWorkbook()) { XSSFSheet sheet = wb.createSheet("barchart"); XSSFDrawing drawing = sheet.createDrawingPatriarch(); XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 0, 6, 15); XSSFChart chart = drawing.createChart(anchor); chart.setTitleText("Chart title"); chart.setTitleOverlay(false); XDDFChartLegend legend = chart.getOrAddLegend(); legend.setPosition(LegendPosition.RIGHT); XDDFDataSource<String> cat = XDDFDataSourcesFactory.fromArray(new String[]{"Russia","Canada","USA"}); XDDFNumericalDataSource<Double> val = XDDFDataSourcesFactory.fromArray(new Double[]{170d, 99d, 98d}); //XDDFChartData data = new XDDFPieChartData(chart.getCTChart().getPlotArea().addNewPieChart()); XDDFChartData data = chart.createData(ChartTypes.PIE, null, null); data.setVaryColors(true); XDDFChartData.Series series = data.addSeries(cat, val); series.setTitle("Series", null); chart.plot(data); try (FileOutputStream fileOut = new FileOutputStream("ooxml-pie-chart.xlsx")) { wb.write(fileOut); } } } }  例えば。これは、チャートデータストレージの不適切な形式です。 Googleスプレッドシートでは、シートからではなく文字列リテラル式からデータを取得するようなグラフも表示されません。

    だからそれをしないでください。代わりに、データをシートに入れます。データを表示しない場合は、非表示のシートに入れてください。

    チャートのデータを別のシートに配置する方法の例。このコードも import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xddf.usermodel.*; import org.apache.poi.xddf.usermodel.chart.*; import org.apache.poi.xssf.usermodel.*; public class BarChartFromArray { public static void main(String[] args) throws IOException { try (XSSFWorkbook wb = new XSSFWorkbook()) { XSSFSheet sheet = wb.createSheet("barchart"); XSSFDrawing drawing = sheet.createDrawingPatriarch(); XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 0, 10, 15); XSSFChart chart = drawing.createChart(anchor); chart.setTitleText("Chart title"); chart.setTitleOverlay(false); XDDFCategoryAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM); bottomAxis.setTitle("cat"); XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT); leftAxis.setTitle("val"); leftAxis.setCrosses(AxisCrosses.AUTO_ZERO); leftAxis.setCrossBetween(AxisCrossBetween.BETWEEN); XDDFDataSource<String> cat = XDDFDataSourcesFactory.fromArray(new String[]{"Russia","Canada","USA"}); XDDFNumericalDataSource<Double> val = XDDFDataSourcesFactory.fromArray(new Double[]{170d, 99d, 98d}); XDDFChartData data = chart.createData(ChartTypes.BAR, bottomAxis, leftAxis); data.setVaryColors(false); XDDFChartData.Series series = data.addSeries(cat, val); series.setTitle("Series", null); chart.plot(data); XDDFBarChartData bar = (XDDFBarChartData) data; bar.setBarDirection(BarDirection.COL); try (FileOutputStream fileOut = new FileOutputStream("ooxml-bar-chart.xlsx")) { wb.write(fileOut); } } } } を使用しています 。

    円グラフの場合:

    <前>ウィズウィズ

    そして棒グラフの場合:

    <前>ウィズウィズ ={"Russia","Canada","USA"}

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ xml - javalangOutOfMemoryError:Javaヒープスペースエラー、intellijアイデアでStaxパーサーを介して5MBデータを解析中