将Excel工作表(带图表)复制到另一个Excel工作表

时间:2016-03-24 13:39:54

标签: java excel apache-poi

我正在使用APACHE POI 3.0将图纸添加到现有的Excel工作表中。它工作正常。 但是由于APACHE POI在制作图表方面存在局限性,我使用模板excel文件来创建图表,这也很好,但这总是会产生新的excel文件。 如果我有一个现有的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;
    }

上面是我的代码,它是一个代码。我分成两部分。 Section是使用模板制作图表excel表的部分。

1 个答案:

答案 0 :(得分:0)

HSSFWorkbook类中的方法cloneSheet()。试试吧。