Excel 转 PDF在线预览功能

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;

import jxl.Cell;
import jxl.Range;
import jxl.Sheet;
import jxl.Workbook;
import jxl.format.Border;
import jxl.format.CellFormat;
import jxl.format.Colour;
import jxl.read.biff.BiffException;

public class ExcelToPdf {
	public static void toPdf (String xlsFilePath,String pdfFilePath) throws DocumentException, IOException, BiffException {  
        //竖排模式,大小为A4,四周边距均为0
//		Document document = new Document(PageSize.A4, 0, 0, 0, 0);
        //横排模式,大小为A4,四周边距均为50
        Document document = new Document(PageSize.A4.rotate(),50,50,50,50);
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(pdfFilePath));  
        Workbook workbook = Workbook.getWorkbook(new File(xlsFilePath));  
        //字体设置    
        /*  
         * 由于itext不支持中文,所以需要进行字体的设置,我这里让itext调用windows系统的中文字体,  
         * 找到文件后,打开属性,将文件名及所在路径作为字体名即可。  
         */    
        //创建BaseFont对象,指明字体,编码方式,是否嵌入    
        //BaseFont bf = BaseFont.createFont("C:\\Windows\\Fonts\\simkai.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 
        BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.EMBEDDED);
        //创建Font对象,将基础字体对象,字体大小,字体风格    
        Font font=new Font(bf,10,Font.BOLD);    
        Font font2=new Font(bf,10,Font.NORMAL); 
        int rowNum = 0;  
        int colNum = 0;  
        Sheet sheet=workbook.getSheet(0);  
		int column=sheet.getColumns();  
		  
		//下面是找出表格中的空行和空列  
		List<Integer> nullCol = new ArrayList<>();  
		List<Integer> nullRow = new ArrayList<>();  
		for(int j=0;j<sheet.getColumns();j++){  
		    int nullColNum = 0;  
		    for(int i=0;i<sheet.getRows();i++){  
		        Cell cell=sheet.getCell(j, i);  
		        String str = cell.getContents();  
		        if(str == null || "".equals(str)){  
		            nullColNum ++ ;  
		        }  
		    }  
		    if(nullColNum == sheet.getRows()){  
		        nullCol.add(j);  
		        column--;  
		    }  
		}  
		  
		for(int i=0;i<sheet.getRows();i++){  
		    int nullRowNum = 0;  
		    for(int j=0;j<sheet.getColumns();j++){  
		        Cell cell=sheet.getCell(j, i);  
		        String str = cell.getContents();  
		        if(str == null || "".equals(str)){  
		            nullRowNum ++ ;  
		        }  
		    }  
		    if(nullRowNum == sheet.getColumns()){  
		        nullRow.add(i);  
		    }  
		}  
		PdfPTable table=new PdfPTable(column);
		Range[] ranges = sheet.getMergedCells();  
		  
		PdfPCell cell1=new PdfPCell();  
		for(int i=0;i<sheet.getRows();i++){  
		    if(nullRow.contains(i)){    //如果这一行是空行,这跳过这一行  
		        continue;  
		    }  
		    for(int j=0;j<sheet.getColumns();j++){  
		        if(nullCol.contains(j)){    //如果这一列是空列,则跳过这一列  
		            continue;  
		        }  
		        boolean flag = true;  
		        Cell cell=sheet.getCell(j, i);
		        String str = cell.getContents(); 
		        for(Range range : ranges){    //合并的单元格判断和处理  
		            if(j >= range.getTopLeft().getColumn() && j <= range.getBottomRight().getColumn()   
		                    && i >= range.getTopLeft().getRow() && i <= range.getBottomRight().getRow()){  
		                if(str == null || "".equals(str)){  
		                    flag = false;  
		                    break;  
		                }  
		                rowNum = range.getBottomRight().getRow() - range.getTopLeft().getRow()+1;  
		                colNum = range.getBottomRight().getColumn() - range.getTopLeft().getColumn()+1;  
		                if(rowNum > colNum){  
		                    cell1 = mergeRow(str, font, rowNum);  
		                    cell1.setColspan(colNum);  
		                    table.addCell(cell1);  
		                }else {  
		                    cell1 = mergeCol(str, font, colNum);  
		                    cell1.setRowspan(rowNum);  
		                    table.addCell(cell1);  
		                }  
		                //System.out.println(num1 + "  " + num2);  
		                flag = false;  
		                break;  
		            }  
		        }  
		        if(flag){  
		        	PdfPCell pdfCell = getPDFCell(str,font2);
		        	CellFormat cellFormat = cell.getCellFormat();
		        	if(cellFormat!=null){
		        		Border arg0 = Border.LEFT;
						Colour borderColour = cellFormat.getBorderColour(arg0);
						int value = borderColour.getValue();
						if(8==value){
						}else{
							pdfCell.setBorder(0);
						}
		        	}else{
		        		pdfCell.setBorder(0);
		        	}
		            table.addCell(pdfCell);           
		        }
		    }  
		}  
		  
		workbook.close();  
		document.open();        
		document.add(table);    
		document.close();    
		writer.close();  
    }  
  
    //合并行的静态函数    
    private static PdfPCell mergeRow(String str,Font font,int i) {    
        //创建单元格对象,将内容及字体传入    
        PdfPCell cell=new PdfPCell(new Paragraph(str,font));    
        //设置单元格内容居中    
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);    
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);    
        //将该单元格所在列包括该单元格在内的i行单元格合并为一个单元格    
        cell.setRowspan(i);
        cell.setBorder(0);
            
        return cell;    
    }    
    
    //合并列的静态函数    
    private static PdfPCell mergeCol(String str,Font font,int i) {    
        PdfPCell cell=new PdfPCell(new Paragraph(str,font));    
        cell.setMinimumHeight(25);    
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);    
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);    
        //将该单元格所在行包括该单元格在内的i列单元格合并为一个单元格    
        cell.setColspan(i); 
        cell.setBorder(0);
            
        return cell;    
    }    
      
     //获取指定内容与字体的单元格    
    private static PdfPCell getPDFCell(String string, Font font){  
        //创建单元格对象,将内容与字体放入段落中作为单元格内容    
        PdfPCell cell=new PdfPCell(new Paragraph(string,font));    
        //设置最小单元格高度    
        cell.setMinimumHeight(25);    
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);    
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);    
        
        return cell;    
    }   

}

直接贴出工具类,需要注意的是itextpdf版本问题(否则会有"STSong-Light’ with ‘UniGB-UCS2-H’ is not recognized"问题)

<!-- itextpdf相关包 -->
<dependency>
	<groupId>com.itextpdf</groupId>
	<artifactId>itext-asian</artifactId>
	<version>5.2.0</version>
</dependency>	
      <dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.11</version>
</dependency>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值