programing

Java Apache POI Excel PDF로 저장

css3 2023. 6. 4. 22:29

Java Apache POI Excel PDF로 저장

변환/저장 방법excel로 철하다.pdf사용 중java play framework일부를 생성하기 위해excel파일 및 이제 요구 사항이 다음으로 변경됩니다.pdf모든 것을 기록하고 싶지는 않습니다.

로 변환할 수 있는 방법이 있습니까?pdf?

excel생성하는 파일은 템플릿에서 가져온 것입니다. Excel 템플릿 파일을 읽고 변경 사항을 작성한 다음 새 Excel 파일로 저장합니다.이렇게 하면 템플릿이 변경되지 않습니다.테두리, 이미지 및 기타 형식이 포함되어 있습니다.

프로그램이 작동하려면 다음 Java 라이브러리와 관련 JAR 파일이 필요합니다.POI v3.8 iText v5.3.4

이 예제를 사용하여 XLS를 PDF로 변환합니다.

Excel 스프레드시트 데이터를 입력으로 받아 PDF 테이블 데이터로 변환하는 전체 Java 코드는 다음과 같습니다.

 import java.io.FileInputStream;
    import java.io.*;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.ss.usermodel.*;
    import java.util.Iterator;
   import com.itextpdf.text.*;
    import com.itextpdf.text.pdf.*;

    public class excel2pdf {  
            public static void main(String[] args) throws Exception{

                    FileInputStream input_document = new FileInputStream(new File("C:\\excel_to_pdf.xls"));
                    // Read workbook into HSSFWorkbook
                    HSSFWorkbook my_xls_workbook = new HSSFWorkbook(input_document); 
                    // Read worksheet into HSSFSheet
                    HSSFSheet my_worksheet = my_xls_workbook.getSheetAt(0); 
                    // To iterate over the rows
                    Iterator<Row> rowIterator = my_worksheet.iterator();
                    //We will create output PDF document objects at this point
                    Document iText_xls_2_pdf = new Document();
                    PdfWriter.getInstance(iText_xls_2_pdf, new FileOutputStream("Excel2PDF_Output.pdf"));
                    iText_xls_2_pdf.open();
                    //we have two columns in the Excel sheet, so we create a PDF table with two columns
                    //Note: There are ways to make this dynamic in nature, if you want to.
                    PdfPTable my_table = new PdfPTable(2);
                    //We will use the object below to dynamically add new data to the table
                    PdfPCell table_cell;
                    //Loop through rows.
                    while(rowIterator.hasNext()) {
                            Row row = rowIterator.next(); 
                            Iterator<Cell> cellIterator = row.cellIterator();
                                    while(cellIterator.hasNext()) {
                                            Cell cell = cellIterator.next(); //Fetch CELL
                                            switch(cell.getCellType()) { //Identify CELL type
                                                    //you need to add more code here based on
                                                    //your requirement / transformations
                                            case Cell.CELL_TYPE_STRING:
                                                    //Push the data from Excel to PDF Cell
                                                     table_cell=new PdfPCell(new Phrase(cell.getStringCellValue()));
                                                     //feel free to move the code below to suit to your needs
                                                     my_table.addCell(table_cell);
                                                    break;
                                            }
                                            //next line
                                    }

                    }
                    //Finally add the table to PDF document
                    iText_xls_2_pdf.add(my_table);                       
                    iText_xls_2_pdf.close();                
                    //we created our pdf file..
                    input_document.close(); //close xls
            }
    }

이것이 당신에게 도움이 되기를 바랍니다.

아시리아의 답변에 추가

위 아시리아의 코드는 이 문제를 해결하는 데 많은 도움이 되었습니다.만약 당신이 당신의 excel pdf 내보내기와 똑같이 보이는 결과 PDF에 관심이 없다면 santhosh의 답변은 좋을 것입니다.하지만, 예를 들어, Apache POI를 사용하여 Excel 템플릿을 작성한 다음 모양을 유지하면서 iText에 코드를 많이 쓰지 않고 내보내기를 시도한다면 VBS 옵션은 매우 유용합니다.

위에 있는 코틀린 아시리아의 자바 버전을 공유하여 누구든 도움이 될 수 있도록 하겠습니다.솔루션의 일반적인 형태에 대한 모든 공은 아시리아에 있습니다.

Java의 경우:

try {
    //create a temporary file and grab the path for it
    Path tempScript = Files.createTempFile("script", ".vbs");

    //read all the lines of the .vbs script into memory as a list
    //here we pull from the resources of a Gradle build, where the vbs script is stored
    System.out.println("Path for vbs script is: '" + Main.class.getResource("xl2pdf.vbs").toString().substring(6) + "'");
    List<String> script = Files.readAllLines(Paths.get(Main.class.getResource("xl2pdf.vbs").toString().substring(6)));

    // append test.xlsm for file name. savePath was passed to this function
    String templateFile = savePath + "\\test.xlsm";
    templateFile = templateFile.replace("\\", "\\\\");
    String pdfFile = savePath + "\\test.pdf";
    pdfFile = pdfFile.replace("\\", "\\\\");
    System.out.println("templateFile is: " + templateFile);
    System.out.println("pdfFile is: " + pdfFile);

    //replace the placeholders in the vbs script with the chosen file paths
    for (int i = 0; i < script.size(); i++) {
        script.set(i, script.get(i).replaceAll("XL_FILE", templateFile));
        script.set(i, script.get(i).replaceAll("PDF_FILE", pdfFile));
        System.out.println("Line " + i + " is: " + script.get(i));
    }

    //write the modified code to the temporary script
    Files.write(tempScript, script);

    //create a processBuilder for starting an operating system process
    ProcessBuilder pb = new ProcessBuilder("wscript", tempScript.toString());

    //start the process on the operating system
    Process process = pb.start();

    //tell the process how long to wait for timeout
    Boolean success = process.waitFor(timeout, minutes);
    if(!success) {
        System.out.println("Error: Could not print PDF within " + timeout + minutes);
    } else {
        System.out.println("Process to run visual basic script for pdf conversion succeeded.");
    }
    
} catch (Exception e) {
    e.printStackTrace();
    Alert saveAsPdfAlert = new Alert(AlertType.ERROR);
    saveAsPdfAlert.setTitle("ERROR: Error converting to pdf.");
    saveAsPdfAlert.setHeaderText("Exception message is:");
    saveAsPdfAlert.setContentText(e.getMessage());
    saveAsPdfAlert.showAndWait();  
}

VBS:

Option Explicit
Dim objExcel, strExcelPath, objSheet

strExcelPath = "XL_FILE"


Set objExcel = CreateObject("Excel.Application")
objExcel.WorkBooks.Open strExcelPath
Set objSheet = objExcel.ActiveWorkbook.Worksheets(1)

objSheet.ExportAsFixedFormat 0, "PDF_FILE",0, 1, 0, , , 0

objExcel.ActiveWorkbook.Close
objExcel.Application.Quit

다른 방법은 VB 스크립트를 사용하여 Java에서 호출하는 것입니다.

예:

xl2pdf.vbs

Option Explicit
Dim objExcel, strExcelPath, objSheet

strExcelPath = "$XL_FILE"

Set objExcel = CreateObject("Excel.Application")
objExcel.WorkBooks.Open strExcelPath
Set objSheet = objExcel.ActiveWorkbook.Worksheets(1)

objSheet.ExportAsFixedFormat 0, "$PDF_FILE",0, 1, 0, , , 0

objExcel.ActiveWorkbook.Close
objExcel.Application.Quit

자바 언어(사실 코틀린이지만 번역하기 쉽다)

fun xl2pdf(xlFile: Path, pdfFile: Path, timeout: Long = 1, timeUnit: TimeUnit = TimeUnit.MINUTES) {
  val tempScript = Files.createTempFile("script", ".vbs")
  val script = Files.readAllLines(Paths.get("xl2pdf.vbs"))
          .map { it.replace("\$XL_FILE", "$xlFile") }
          .map { it.replace("\$PDF_FILE", "$pdfFile") }
  Files.write(tempScript, script)
  try {
    val pb = ProcessBuilder("wscript", tempScript.toString())
    val process = pb.start()
    val success = process.waitFor(timeout, timeUnit)
    if (!success) LOG.error("Could not print PDF within $timeout $timeUnit")
  } catch (e: IOException) {
    LOG.error("Error while printing Excel file to PDF", e)
  }
}
<repository>
    <id>com.e-iceblue</id>
    <name>e-iceblue</name>
    <url>http://repo.e-iceblue.com/nexus/content/groups/public/</url>
</repository>

<dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.xls.free</artifactId>
    <version>5.1.0</version>
</dependency>

import com.spire.xls.FileFormat;
import com.spire.xls.Workbook;

import java.io.File;

public class EIceblueConverter {
    public static void main(String[] args) {
        for (Sources xls : Sources.values()) {
            if (isFileExists(xls)) convert(xls);
        }
    }

    private static boolean isFileExists(Sources xls) {
        File file = new File(xls.getPath());
        return file.exists() && file.isFile();
    }

    private static void convert(Sources xls) {
        Workbook workbook = new Workbook();
        workbook.loadFromFile(xls.getPath());
        workbook.getConverterSetting().setSheetFitToPage(true);
        workbook.saveToFile(Util.getOutputPath(xls.getPath()), FileFormat.PDF);
    }
}

변환하기 전에 파일에서 보기 영역을 편집해야 합니다.xls*
여기에 이미지 설명 입력

흥미로운 솔루션을 포함한 더 많은 변환기: libreoffice를 .xls*에서 .pdf로 변환기로 사용합니다.(src/main/java/jodconverter/AppStarter.java에서 테스트)

https://github.com/fedor83/xlsToPdfConverter.git

다음은 전체 가장자리 작동 예제입니다.

종속성:

compile 'com.itextpdf:itextpdf:5.5.13.2'
compile 'org.apache.poi:poi-ooxml:5.0.0'

Java 코드:

import java.io.*;
import org.apache.poi.ss.usermodel.*;

import java.util.Iterator;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;

public class Excel2PDF {
    public static void main(String[] args) throws Exception {

        Workbook my_xls_workbook = WorkbookFactory.create(new File("/Users/harshad/Desktop/excel.xlsx"));

        Sheet my_worksheet = my_xls_workbook.getSheetAt(0);

        short availableColumns = my_worksheet.getRow(0).getLastCellNum();
        System.out.println("Available columns : " + availableColumns);

        Iterator<Row> rowIterator = my_worksheet.iterator();

        Document iText_xls_2_pdf = new Document();
        PdfWriter.getInstance(iText_xls_2_pdf, new FileOutputStream("/Users/harshad/Desktop/excel.pdf"));
        iText_xls_2_pdf.open();

        PdfPTable my_table = new PdfPTable(availableColumns);

        PdfPCell table_cell = null;

        while (rowIterator.hasNext()) {
            Row row = rowIterator.next();
            Iterator<Cell> cellIterator = row.cellIterator();

            while (cellIterator.hasNext()) {
                Cell cell = cellIterator.next();

                switch (cell.getCellType()) {
                    default:
                        try {
                            table_cell = new PdfPCell(new Phrase(cell.getStringCellValue()));
                        } catch (IllegalStateException illegalStateException) {
                            //TODO: Need to handle exceptions for different type too
                            if (illegalStateException.getMessage().equals("Cannot get a STRING value from a NUMERIC cell")) {
                                table_cell = new PdfPCell(new Phrase(String.valueOf(cell.getNumericCellValue())));
                            }
                        }

                        my_table.addCell(table_cell);
                        break;
                }
            }
        }
        iText_xls_2_pdf.add(my_table);
        iText_xls_2_pdf.close();
        my_xls_workbook.close();
    }
}

언급URL : https://stackoverflow.com/questions/26056485/java-apache-poi-excel-save-as-pdf