2016-08-12 10 views
5

के साथ एक्सेल में बार चार्ट बनाएं, मैं अपाचे पीओआई का उपयोग कर एक्सएलएसएक्स स्प्रेडशीट में बार चार्ट बनाने की कोशिश कर रहा हूं, लेकिन एक्सेल यह कहता रहता है कि फ़ाइल खोलने का प्रयास करते समय सामग्री में कोई समस्या है और चार्ट को हटा रहा है ।अपाचे पीओआई

public static void createBarChart() { 

     Workbook wb = new XSSFWorkbook(); 
     Sheet sheet = wb.createSheet("Sheet2"); 
     Row row; 
     Cell cell; 

     row = sheet.createRow(0); 
     row.createCell(0); 
     row.createCell(1).setCellValue("HEADER 1"); 
     row.createCell(2).setCellValue("HEADER 2"); 
     row.createCell(3).setCellValue("HEADER 3"); 

     for (int r = 1; r < 5; r++) { 
      row = sheet.createRow(r); 
      cell = row.createCell(0); 
      cell.setCellValue("Serie " + r); 
      cell = row.createCell(1); 
      cell.setCellValue(123); 
      cell = row.createCell(2); 
      cell.setCellValue(456); 
      cell = row.createCell(3); 
      cell.setCellValue(789); 
     } 

     Drawing drawing = sheet.createDrawingPatriarch(); 
     ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 5, 20); 

     Chart chart = drawing.createChart(anchor); 

     CTChart ctChart = ((XSSFChart) chart).getCTChart(); 

     ctChart.addNewTitle(); 

     CTPlotArea ctPlotArea = ctChart.getPlotArea(); 
     CTBarChart ctBarChart = ctPlotArea.addNewBarChart(); 

     ctBarChart.addNewBarDir().setVal(STBarDir.COL); 
     ctBarChart.addNewGrouping().setVal(STBarGrouping.CLUSTERED); 
     ctBarChart.addNewVaryColors().setVal(false); 

     // First series 
     CTBarSer ctBarSer = ctBarChart.addNewSer(); 

     ctBarSer.addNewIdx().setVal(0); 
     ctBarSer.addNewOrder().setVal(0); 

     // [01] Title 
     CTSerTx ctSerTx = ctBarSer.addNewTx(); 
     CTStrRef ctSerTxStrRef = ctSerTx.addNewStrRef(); 
     ctSerTxStrRef.setF("Sheet2!$A$2"); 

     CTStrData strCache = ctSerTxStrRef.addNewStrCache(); 
     strCache.addNewPtCount().setVal(1); 
     CTStrVal newPt = strCache.addNewPt(); 
     newPt.setV("Serie 1"); 
     newPt.setIdx(0); 

     // [01] SpPr 
     CTShapeProperties spPr = ctBarSer.addNewSpPr(); 
     CTSolidColorFillProperties solidFill = spPr.addNewSolidFill(); 
     solidFill.addNewSchemeClr().setVal(STSchemeColorValImpl.ACCENT_1); 
     spPr.addNewLn().addNewNoFill(); 
     spPr.addNewEffectLst(); 

     // [01] Invert if negative 
     ctBarSer.addNewInvertIfNegative().setVal(false); 

     // [01] Series titles 
     CTAxDataSource newCat = ctBarSer.addNewCat(); 
     CTStrRef addNewStrRef = newCat.addNewStrRef(); 
     addNewStrRef.setF("Sheet2!$B$1:$D$1"); 

     CTStrData addNewStrCache = addNewStrRef.addNewStrCache(); 
     addNewStrCache.addNewPtCount().setVal(3); 

     CTStrVal pt1 = addNewStrCache.addNewPt(); 
     pt1.setIdx(0); 
     pt1.setV(sheet.getRow(0).getCell(1).getStringCellValue()); 

     CTStrVal pt2 = addNewStrCache.addNewPt(); 
     pt2.setIdx(1); 
     pt2.setV(sheet.getRow(0).getCell(2).getStringCellValue()); 

     CTStrVal pt3 = addNewStrCache.addNewPt(); 
     pt3.setIdx(2); 
     pt3.setV(sheet.getRow(0).getCell(3).getStringCellValue()); 

     // [01] Series values 
     CTNumDataSource newVal = ctBarSer.addNewVal(); 
     CTNumRef numRef = newVal.addNewNumRef(); 
     numRef.setF("Sheet2!$B$2:$D$2"); 
     CTNumData numCache = numRef.addNewNumCache(); 
     numCache.addNewPtCount().setVal(3); 

     CTNumVal numpt1 = numCache.addNewPt(); 
     numpt1.setIdx(0); 
     numpt1.setV(String.valueOf(sheet.getRow(1).getCell(1).getNumericCellValue())); 

     CTNumVal numpt2 = numCache.addNewPt(); 
     numpt2.setIdx(1); 
     numpt2.setV(String.valueOf(sheet.getRow(1).getCell(2).getNumericCellValue())); 

     CTNumVal numpt3 = numCache.addNewPt(); 
     numpt3.setIdx(2); 
     numpt3.setV(String.valueOf(sheet.getRow(1).getCell(3).getNumericCellValue())); 

     // dLbls 
     CTDLbls dLbls = ctBarChart.addNewDLbls(); 
     dLbls.addNewShowBubbleSize().setVal(false); 
     dLbls.addNewShowLegendKey().setVal(false); 
     dLbls.addNewShowCatName().setVal(false); 
     dLbls.addNewShowSerName().setVal(false); 
     dLbls.addNewShowPercent().setVal(false); 
     dLbls.addNewShowVal().setVal(false); 

     FileOutputStream fileOut = new FileOutputStream("barchart.xlsx"); 
     wb.write(fileOut); 
     wb.close(); 
     fileOut.close(); 
    } 

किसी को भी मदद कर सकते हैं मुझे लगता है (और, ठीक है, का समाधान) मुद्दा: यहाँ मैं क्या कर रहा हूँ से भरा कोड है? अग्रिम में धन्यवाद!

उत्तर

12

पुhew, कठिन जन्म ;-)। पृष्ठभूमि के ज्ञान के बिना उपयोगकर्ताओं के लिए Apache POI supports only ScatterCharts and LineCharts why?। सिद्धांत में आगे बढ़ने का वर्णन किया गया है।

जैसा कि मैंने कहा था। पहले परीक्षण के लिए सरलतम संभव बार चार्ट लें। यह एक श्रृंखला है जिसमें दो मान हैं। फिर आप देखेंगे कि आप अपने कोड में अक्ष को पूरी तरह भूल गए हैं। एक पाई चार्ट में कोई अक्ष नहीं है। Thats क्यों वे आवश्यक नहीं हैं। लेकिन एक बार चार्ट axes के बिना काम नहीं करेगा।

इसके बजाय आप "कैश" नामक सभी चीज़ों को अनजाने में भूल सकते हैं।

चाहे अन्य चीजों की आवश्यकता है, प्रयास और त्रुटि द्वारा निर्धारित किया जाता है। इसके अलावा कोई भी Office OpenXML recommendation पढ़ सकता है। शायद minOccurs < वाले सभी तत्वों की अनुपलब्धता> "0" कार्यपुस्तिका खोलते समय ड्रॉइंग को हटाने की ओर ले जाती है।

एक बार चार्ट के लिए सरल उदाहरण:

import java.io.FileOutputStream; 
import org.apache.poi.ss.usermodel.*; 
import org.apache.poi.ss.util.*; 
import org.apache.poi.ss.usermodel.charts.*; 
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 
import org.apache.poi.xssf.usermodel.XSSFChart; 

import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart; 
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea; 
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBarChart; 
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBoolean; 
import org.openxmlformats.schemas.drawingml.x2006.chart.CTBarSer; 
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource; 
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource; 
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumRef; 
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrRef; 
import org.openxmlformats.schemas.drawingml.x2006.chart.CTSerTx; 
import org.openxmlformats.schemas.drawingml.x2006.chart.CTCatAx; 
import org.openxmlformats.schemas.drawingml.x2006.chart.CTValAx; 
import org.openxmlformats.schemas.drawingml.x2006.chart.CTScaling; 
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLegend; 
import org.openxmlformats.schemas.drawingml.x2006.chart.STAxPos; 
import org.openxmlformats.schemas.drawingml.x2006.chart.STBarDir; 
import org.openxmlformats.schemas.drawingml.x2006.chart.STOrientation; 
import org.openxmlformats.schemas.drawingml.x2006.chart.STLegendPos; 
import org.openxmlformats.schemas.drawingml.x2006.chart.STTickLblPos; 

public class BarChart { 

    public static void main(String[] args) throws Exception { 
     Workbook wb = new XSSFWorkbook(); 
     Sheet sheet = wb.createSheet("Sheet1"); 

     Row row; 
     Cell cell; 

     row = sheet.createRow(0); 
     row.createCell(0); 
     row.createCell(1).setCellValue("HEADER 1"); 
     row.createCell(2).setCellValue("HEADER 2"); 
     row.createCell(3).setCellValue("HEADER 3"); 

     for (int r = 1; r < 5; r++) { 
      row = sheet.createRow(r); 
      cell = row.createCell(0); 
      cell.setCellValue("Serie " + r); 
      cell = row.createCell(1); 
      cell.setCellValue(new java.util.Random().nextDouble()); 
      cell = row.createCell(2); 
      cell.setCellValue(new java.util.Random().nextDouble()); 
      cell = row.createCell(3); 
      cell.setCellValue(new java.util.Random().nextDouble()); 
     } 

     Drawing drawing = sheet.createDrawingPatriarch(); 
     ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 8, 20); 

     Chart chart = drawing.createChart(anchor); 

     CTChart ctChart = ((XSSFChart)chart).getCTChart(); 
     CTPlotArea ctPlotArea = ctChart.getPlotArea(); 
     CTBarChart ctBarChart = ctPlotArea.addNewBarChart(); 
     CTBoolean ctBoolean = ctBarChart.addNewVaryColors(); 
     ctBoolean.setVal(true); 
     ctBarChart.addNewBarDir().setVal(STBarDir.COL); 

     for (int r = 2; r < 6; r++) { 
      CTBarSer ctBarSer = ctBarChart.addNewSer(); 
      CTSerTx ctSerTx = ctBarSer.addNewTx(); 
      CTStrRef ctStrRef = ctSerTx.addNewStrRef(); 
      ctStrRef.setF("Sheet1!$A$" + r); 
      ctBarSer.addNewIdx().setVal(r-2); 
      CTAxDataSource cttAxDataSource = ctBarSer.addNewCat(); 
      ctStrRef = cttAxDataSource.addNewStrRef(); 
      ctStrRef.setF("Sheet1!$B$1:$D$1"); 
      CTNumDataSource ctNumDataSource = ctBarSer.addNewVal(); 
      CTNumRef ctNumRef = ctNumDataSource.addNewNumRef(); 
      ctNumRef.setF("Sheet1!$B$" + r + ":$D$" + r); 

      //at least the border lines in Libreoffice Calc ;-) 
      ctBarSer.addNewSpPr().addNewLn().addNewSolidFill().addNewSrgbClr().setVal(new byte[] {0,0,0}); 

     } 

     //telling the BarChart that it has axes and giving them Ids 
     ctBarChart.addNewAxId().setVal(123456); 
     ctBarChart.addNewAxId().setVal(123457); 

     //cat axis 
     CTCatAx ctCatAx = ctPlotArea.addNewCatAx(); 
     ctCatAx.addNewAxId().setVal(123456); //id of the cat axis 
     CTScaling ctScaling = ctCatAx.addNewScaling(); 
     ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX); 
     ctCatAx.addNewDelete().setVal(false); 
     ctCatAx.addNewAxPos().setVal(STAxPos.B); 
     ctCatAx.addNewCrossAx().setVal(123457); //id of the val axis 
     ctCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO); 

     //val axis 
     CTValAx ctValAx = ctPlotArea.addNewValAx(); 
     ctValAx.addNewAxId().setVal(123457); //id of the val axis 
     ctScaling = ctValAx.addNewScaling(); 
     ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX); 
     ctValAx.addNewDelete().setVal(false); 
     ctValAx.addNewAxPos().setVal(STAxPos.L); 
     ctValAx.addNewCrossAx().setVal(123456); //id of the cat axis 
     ctValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO); 

     //legend 
     CTLegend ctLegend = ctChart.addNewLegend(); 
     ctLegend.addNewLegendPos().setVal(STLegendPos.B); 
     ctLegend.addNewOverlay().setVal(false); 

System.out.println(ctChart); 

     FileOutputStream fileOut = new FileOutputStream("BarChart.xlsx"); 
     wb.write(fileOut); 
     fileOut.close(); 
    } 
} 

यह उदाहरण स्कीमा ooxml-schemas-1.3.jarFAQ-N10025 में उल्लिखित के सभी से भरा जार की जरूरत है।

+3

मान लीजिए कि आप इस कोड + ज्ञान का उपयोग XSSF को BarChart कार्यक्षमता में योगदान करने के लिए भी नहीं करना चाहते हैं, है ना? :) – Gagravarr

+0

एक आकर्षण की तरह काम करना :) कमाल का काम, बहुत बहुत धन्यवाद! – LuTHieR

+0

मैंने Poi 3-15 के साथ प्रयास किया, लेकिन गायब कक्षाएं हैं (सीटीबार चार्ट, एसटीबारडीर ...)। इस नमूने में आप किस संस्करण का उपयोग कर रहे हैं? –