2016-03-24 26 views
0

APACHE POI 3.0を使用して既存のExcelシートにシートを追加しています。それはうまく動作します。 しかし、APACHE POIにはチャート作成に関する制限があるため、テンプレートを使用してチャートを作成しましたが、これもうまくいきましたが、これにより常に新しいExcelファイルが作成されます。 既存のExcelシートがあり、チャートを持つシートを追加したい場合は、それを行うことができません。私がグラフを作成するとき、私はテンプレートファイルを使用し、常に新しいExcelファイルを作成します。 シートがチャートエクセルシート(チャートあり)を別のエクセルシートにコピー

public class TagBrowserSelection 
{ 
    private static String[] excelBarPlot_Template  = { "","barPlot_1Panel_template.xlsx"}; 
    private static String[] excelPieChart_Template  = { "","pieChart_1Panel_template.xlsx"}; 
    private static String[] excelPieAndBarPlot_Template = { "","pieAndBarChart_1Panel_template.xlsx"}; 

    private static String REGEX      = ""; 

    static public boolean makeTagBrowserSelection(String strOutputFileName, ArrayList<TagBrowserChildPanel> childList, String sheetName, boolean addSheet, ArrayList<Boolean> chartAttributes) 
    { 
     // chart attributes 
     boolean addBarChart = chartAttributes.get(0); 
     boolean addPieChart = chartAttributes.get(1); 
     boolean addNoTag = chartAttributes.get(2); 
     boolean addZeros = chartAttributes.get(3); 

     REGEX = "^" + sheetName; 
     Pattern p = Pattern.compile(REGEX); 

     String[] templateArray = null; 
     if (addBarChart && addPieChart) 
      templateArray = excelPieAndBarPlot_Template; 
     else if (addBarChart) 
      templateArray = excelBarPlot_Template; 
     else if (addPieChart) 
      templateArray = excelPieChart_Template; 

     try 
     { 
      int number = childList.size(); 
      XSSFWorkbook workbook = null; 
      XSSFWorkbook wb = null; 
      XSSFSheet sheet = null; 
      int col_num = 0; 
      int row_num = 0; 
      XSSFRow row = null; 
      XSSFCell cell = null; 
      // if adding sheet to existing excel file 
      if (addSheet) 
      { 
       FileInputStream fis = new FileInputStream(new File(strOutputFileName)); 
       workbook = new XSSFWorkbook(fis); 
       fis.close(); 

       // number of existing sheets in excel file 
       int numberOfSheets = workbook.getNumberOfSheets(); 

       // check is sheetName exists already 
       if (isSheetExist(sheetName, workbook)) 
       { 
        int counter = 1; 
        for (int ii = 0; ii < numberOfSheets; ii++) 
        { 
         Matcher m = p.matcher(workbook.getSheetName(ii)); 
         if (m.find()) 
          counter++; 
        } 
        sheetName = sheetName + " (" + counter + ")"; 
       } 
      } 
      else 
      { 
       workbook = new XSSFWorkbook(); 
      } 

を持っている優れてシートを追加することのいずれかの解決策がある場合ので、私は思っていた==================== ==========================================

  // if template file needs to be used(if bar chart/pie chart option is selected) 
      if (templateArray != null) 
      { 
       InputStream is = TagBrowserSelection.class.getClassLoader().getResourceAsStream(templateArray[number]); 
       wb = new XSSFWorkbook(OPCPackage.open(is)); 
       sheet = wb.getSheetAt(0); 
       // wb.close(); 
      } 
      else 
      { 
       sheet = workbook.createSheet(sheetName); 
      } 

      // Freeze top two row 
      // sheet.createFreezePane(0, 1, 0, 1); 

      // Filling up the workbook and performing the row/column formatting 
      for (TagBrowserChildPanel child : childList) 
      { 
       // Check if row is already created before(previous tag category) 
       row = sheet.getRow(0); 
       if (row == null) 
        row = sheet.createRow(0); 

       // Adding tag category name as header 
       String tagCategory = child.getSelectedCategory().getName(); 

       cell = row.createCell(col_num); 
       cell.setCellValue(tagCategory); 

       row = sheet.getRow(1); 
       if (row == null) 
        row = sheet.createRow(1); 

       // Adding column headers 
       cell = row.createCell(col_num); 
       cell.setCellValue("tag"); 
       cell = row.createCell(col_num + 1); 
       cell.setCellValue("counts"); 

       row_num = 2; 

       // Adding tag category document summary(name and counts) 
       ArrayList<TagSummaryItem> tagSummary = child.getTagChartCounts(); 
       for (int i = 0; i < tagSummary.size(); i++) 
       { 
        // Check if row is already created before(previous tag category) 
        row = sheet.getRow(row_num); 
        if (row == null) 
         row = sheet.createRow(row_num); 

        cell = row.createCell(col_num); 
        if (!addNoTag) 
        { 
         if (tagSummary.get(i).m_strTag == "[No Tag]") 
          continue; 
        } 
        if (!addZeros) 
        { 
         if (tagSummary.get(i).m_nCount == 0) 
          continue; 
        } 
        cell.setCellValue(tagSummary.get(i).m_strTag); 
        cell = row.createCell(col_num + 1); 
        cell.setCellValue(tagSummary.get(i).m_nCount); 
        row_num++; 
       } 
       // auto-size of tag column 
       sheet.autoSizeColumn(col_num); 

       col_num = col_num + 3; 
      } 

      FileOutputStream out = new FileOutputStream(strOutputFileName); 

      if (templateArray != null) 
      { 
       wb.setSheetName(0, sheetName); 
       wb.write(out); 
       wb.close(); 
      } 
      else 
      { 
       workbook.write(out); 
       workbook.close(); 
      } 
      out.close(); 
     } 
     catch (Exception e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return true; 
    } 

上記は私のコード、その1つのコードです。私は2つのセクションに分割した。セクションは、チャートを作成するためにテンプレートを使用するセクションです。

答えて

0

HSSFWorkbookクラスにcloneSheet()メソッドがあります。それを試してみてください。

+1

この回答は技術的には正しいかもしれませんが、品質は非常に低いです。精巧! – SubliemeSiem

+0

これは同じワークブックの場合にのみ機能します。あるブックから別のブックにシートをコピーする必要があります。私はすべてのセルをコピーしようとしましたが、グラフではなく値だけをコピーしました。 – user1631306

関連する問題