Excel文件未完全打印出来

时间:2018-03-29 14:55:21

标签: java excel apache-poi jacob

我正在使用JACOB打印出Excel文件。该文件是通过Apache POI创建的。当我保存文件或将其发送到Outlook时,一切正常,该文件包含所有工作表。但是当我将文件发送到共享打印机时,它开始打印,但随后显示错误:错误 - 发送到打印机。打印作业的大小约为230 kB,所以它不应该太大。

更新:我在打印前没有更新文件时打印出文件。但是现在按下“打印输出”按钮,我必须用红色标记包含超出限制值的单元格,然后再调用打印功能。

UPDATE2 :我将Excel文件转换为PDF并使用Apache PDFBox将其打印出来 - 仍然是同样的问题。 Java中没有错误,打印文档中的某些工作表,然后发生打印机错误:错误 - 发送到打印机。

UPDATE3 :我添加了一个函数,用于填写Excel工作表。

哪里有问题?您可以在下面找到打印功能代码:

public class AppExcelPrinter { 
    private ActiveXComponent excel; 
    private Dispatch workbooks; 
    private Variant workbook; 
    public AppExcelPrinter() { } 
    public synchronized void print(String filename, String printer)  { 
        try { 
            ComThread.InitMTA(); 
            excel = new ActiveXComponent("Excel.Application");  //we are going to listen to events on Application   
            excel.setProperty("Visible", new Variant(false));   //the file will be invisible during printing      
            workbooks = excel.getProperty("WorkBooks").toDispatch(); 
            workbook = Dispatch.callN(workbooks, "Open", new Object[] { filename }); 
            Variant From =new Variant(1);  
            Variant To =new Variant(6);  //I have 6 sheets in my Excel file
            Variant Copies =new Variant(1);  
            Variant Preview =new Variant(false);  
            Variant ActivePrinter =new Variant(printer); 
            Variant PrintToFile = new Variant(false);
            Variant Collate = new Variant(false);
            Object[] args=new Object[]{From, To, Copies, Preview, ActivePrinter, PrintToFile, Collate};
            Dispatch.call(Dispatch.get(workbook.toDispatch(), "Worksheets").toDispatch(), "PrintOut", args); 
            try { 
                Thread.sleep(100);}// the sleep is required to let everything clear out after the quit
            catch (InterruptedException e) { 
                e.printStackTrace();}}
        finally { 
            Variant f = new Variant(false);
            Dispatch.call(workbook.toDispatch(), "Close", f);
            excel.invoke("Quit", new Variant[] {});  
            ComThread.Release(); }}    
 }

填写表格的功能:

Path original = Paths.get("");
String original1=original.toAbsolutePath().toString();
String original2=original1+"\\example.xlsx";
Path path1 = Paths.get(original2);
String target = original1+"\\temp\\temp.xlsx";
Path path2 = Paths.get(target);
try {    // Copy template, which will be filled in
    Files.copy(path1, path2, StandardCopyOption.REPLACE_EXISTING);}
catch (IOException ex) {
    JOptionPane.showMessageDialog(null, "Error while working with temporary files", "Error", JOptionPane.ERROR_MESSAGE);}
try {

    String VCAMvexp1=jTable16.getModel().getValueAt(2, 0).toString();
    ... //I have 6 jTables with 15 rows and 10 columns
    try {
            FileInputStream temp_file = new FileInputStream(new File(target)); 
            XSSFWorkbook wb = new XSSFWorkbook(temp_file);
            XSSFSheet worksheet = wb.getSheetAt(0); //separate sheet for each jTable
            XSSFSheet worksheet1 = wb.getSheetAt(1);
            XSSFSheet worksheet2 = wb.getSheetAt(2);
            XSSFSheet worksheet3 = wb.getSheetAt(3);
            XSSFSheet worksheet4 = wb.getSheetAt(4);
            XSSFSheet worksheet5 = wb.getSheetAt(5);
            CellStyle style = wb.createCellStyle();
            style.setFillForegroundColor(IndexedColors.RED.getIndex());
            style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
            style.setBorderBottom(BorderStyle.THICK);
            style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
            style.setBorderLeft(BorderStyle.THICK);
            style.setLeftBorderColor(IndexedColors.BLACK.getIndex());
            style.setBorderRight(BorderStyle.THICK);
            style.setRightBorderColor(IndexedColors.BLACK.getIndex());
            style.setBorderTop(BorderStyle.THICK);
            style.setTopBorderColor(IndexedColors.BLACK.getIndex());
            style.setAlignment(HorizontalAlignment.CENTER);
            Font font = wb.createFont();
            font.setFontHeightInPoints((short)10);
            font.setFontName("Arial");
            style.setFont(font);
            Cell VCAMvexp1cell = worksheet.getRow(12).getCell(6);   
            VCAMvexp1cell.setCellValue(VCAMvexp1);
            if (Float.parseFloat(VCAMvexp1)<Float.parseFloat(VCAMvexp1_min) || Float.parseFloat(VCAMvexp1)>Float.parseFloat(VCAMvexp1_max)) {
                VCAMvexp1cell.setCellStyle(style);}
            ... //fill in the sheets and mark cells with red color
            temp_file.close(); 
            FileOutputStream output_file = new FileOutputStream(new File(target));
            wb.write(output_file);
            output_file.close();
        }
        catch (FileNotFoundException e) {
            JOptionPane.showMessageDialog(null, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);}
        catch (IOException ex){
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);}
    }
    catch (NullPointerException e) {
        JOptionPane.showMessageDialog(null, "Cannot save the data. Table is not filled in completely", "Error", JOptionPane.ERROR_MESSAGE);}

1 个答案:

答案 0 :(得分:0)

解决方案是将打印协议从WSD更改为LPD。之后,文件被完全打印出来。