使用java将包含图像,绘图的复杂excel转换为pdf

时间:2014-02-16 12:17:16

标签: java excel pdf apache-poi itext

任何人都可以告诉我是否可以使用poi和itext开源apis(包括不需要openoffice)将包含图像,图纸的excel转换为pdf。

我的代码如下所示,代码工作正常......但复杂的excel我没有得到确切的pdf

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.Iterator;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import com.itextpdf.text.Anchor;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Chapter;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Section;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;

public class ExceltoPDF {

    /**
     * @param args
     * @throws Exception
     */

    private static String FILE = "C:\\Users\\Work\\Downloads\\OIS-Project Planning.pdf";
    private static Font catFont = new Font(Font.FontFamily.TIMES_ROMAN, 18,
            Font.BOLD);
    private static Font redFont = new Font(Font.FontFamily.TIMES_ROMAN, 12,
            Font.NORMAL, BaseColor.RED);
    private static Font subFont = new Font(Font.FontFamily.TIMES_ROMAN, 16,
            Font.BOLD);
    private static Font smallBold = new Font(Font.FontFamily.TIMES_ROMAN, 12,
            Font.BOLD);
    //Find out number of columns in the excel 
    private static int numberOfColumns;

    public static void main(String[] args) {

        String excelFile = "C:\\Users\\Work\\Downloads\\OIS-Project Planning.xlsx";

        File xlsFile = new File(excelFile);
        Workbook workbook;
        try {
            workbook = loadSpreadSheet(xlsFile);
            readSpreadSheet(workbook);
        } catch (FileNotFoundException e) {
            System.err.println("Excel File (or) PDF File is already opened. Please close the file");
            System.exit(1);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void readSpreadSheet(Workbook workbook) throws IOException,
            DocumentException {

        Document document = new Document();
        PdfWriter.getInstance(document, new FileOutputStream(FILE));
        document.open();
        addMetaData(document);
        addTitlePage(document);

        Anchor anchor = new Anchor("First Chapter", catFont);
        anchor.setName("First Chapter");

        // Second parameter is the number of the chapter
        Chapter catPart = new Chapter(new Paragraph(anchor), 1);

        Paragraph subPara = new Paragraph("Table", subFont);
        Section subCatPart = catPart.addSection(subPara);
        addEmptyLine(subPara, 5);

        Sheet sheet = workbook.getSheetAt(0);

        // Iterate through each rows from first sheet
        Iterator<Row> rowIterator = sheet.iterator();

        int temp = 0;
        boolean flag = true;
        PdfPTable table = null;

        while (rowIterator.hasNext()) {
            Row row = rowIterator.next();
            int cellNumber = 0;

            if (flag) {
                table = new PdfPTable(row.getLastCellNum());
                flag = false;
            }

            // For each row, iterate through each columns
            Iterator<Cell> cellIterator = row.cellIterator();
            while (cellIterator.hasNext()) {
                Cell cell = cellIterator.next();

                switch (cell.getCellType()) {   
                case Cell.CELL_TYPE_STRING: 
                    if (temp == 0) {            
                        numberOfColumns = row.getLastCellNum();
                        PdfPCell c1 = new PdfPCell(new Phrase(
                                cell.getStringCellValue()));
                        c1.setHorizontalAlignment(Element.ALIGN_CENTER);
                        table.addCell(c1);
                        table.setHeaderRows(1);

                    }else{
                        cellNumber =checkEmptyCellAndAddCellContentToPDFTable(cellNumber,cell,table);
                    }                   
                    cellNumber++;
                    break;

                case Cell.CELL_TYPE_NUMERIC:
                    cellNumber =checkEmptyCellAndAddCellContentToPDFTable(cellNumber,cell,table);
                    cellNumber++; 
                    break;
                }       
            }
            temp = 1;
            if(numberOfColumns != cellNumber){
                for(int i=0;i<(numberOfColumns-cellNumber);i++){
                    table.addCell(" ");
                }
            }
        }
        subCatPart.add(table);
        // Now add all this to the document
        document.add(catPart);
        document.close();
    }

    private static int checkEmptyCellAndAddCellContentToPDFTable(int cellNumber, Cell cell, PdfPTable table) {
        if (cellNumber == cell.getColumnIndex()) {
            if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC){
                table.addCell(Double.toString(cell.getNumericCellValue()));
            }
            if(cell.getCellType() == Cell.CELL_TYPE_STRING){
                table.addCell(cell.getStringCellValue());
            }

        } else {
            while( cellNumber < cell.getColumnIndex()) {

                    table.addCell(" ");
                    cellNumber++;

            }
            if (cellNumber == cell.getColumnIndex()) {
                if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC){
                    table.addCell(Double.toString(cell.getNumericCellValue()));
                }
                if(cell.getCellType() == Cell.CELL_TYPE_STRING){
                    table.addCell(cell.getStringCellValue());
                }

            }
            cellNumber = cell.getColumnIndex();
        }   

        return cellNumber;
    }

    private static void addMetaData(Document document) {
        document.addTitle("My first PDF");
        document.addSubject("Using iText");
        document.addKeywords("Java, PDF, iText");
        document.addAuthor("Uvaraj");
        document.addCreator("Uvaraj");
    }

    private static void addTitlePage(Document document)
            throws DocumentException {
        Paragraph preface = new Paragraph();
        // We add one empty line
        addEmptyLine(preface, 1);
        // Lets write a big header
        preface.add(new Paragraph("Title of the document", catFont));

        addEmptyLine(preface, 1);
        // Will create: Report generated by: _name, _date
        preface.add(new Paragraph("Report generated by: " + "Uvaraj" + ", "
                + new Date(), smallBold));
        addEmptyLine(preface, 3);
        preface.add(new Paragraph(
                "This document describes something which is very important ",
                smallBold));

        addEmptyLine(preface, 8);

        preface.add(new Paragraph(
                "This document is a preliminary version  ;-).", redFont));

        document.add(preface);
        // Start a new page
        document.newPage();
    }

    private static void addEmptyLine(Paragraph paragraph, int number) {
        for (int i = 0; i < number; i++) {
            paragraph.add(new Paragraph(" "));
        }
    }

    private static Workbook loadSpreadSheet(File xlsFile) throws Exception {
        Workbook workbook = null;

        String ext = getFileExtension(xlsFile.getName());
        if (ext.equalsIgnoreCase("xlsx")) {
            OPCPackage pkg = OPCPackage.open(xlsFile.getAbsolutePath());
            workbook = new XSSFWorkbook(pkg);
            pkg.close();
        } else if (ext.equalsIgnoreCase("xls")) {
            InputStream xlsFIS = new FileInputStream(xlsFile);
            workbook = new HSSFWorkbook(xlsFIS);
            xlsFIS.close();
        } else {
            throw new Exception("FILE EXTENSION NOT RECOGNIZED");
        }
        return workbook;
    }

    private static String getFileExtension(String fileName) {
        String ext = "";
        int mid = fileName.lastIndexOf(".");
        ext = fileName.substring(mid + 1, fileName.length());
        System.out.println("File Extension --" + ext);
        return ext;
    }

}

0 个答案:

没有答案