項目要做PDF導出數據,還要實現點擊在瀏覽器上下載的效果!於是去網上找有沒有什麼前人寫好的工具包拿過來用,一看果然還是有的!我這邊就直接貼我的實現代碼吧,反正都是百度的!
導入依賴:
<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
工具類:
import com.itextpdf.text.*;
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 com.jeecg.wx.entity.WxDeliveryRecordEntity;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.util.List;
public class PdfReportUtils {
public static void exportPdf(HttpServletResponse response,List<WxDeliveryRecordEntity> list) {
//1,創建文檔對象
Document document = new Document(PageSize.A2);
//2,監聽輸出流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
OutputStream out = null;
try {
PdfWriter.getInstance(document, baos);
//3,打開文檔
document.open();
//4,添加文本
Paragraph paragraph = new Paragraph();
// document.add(new Paragraph("pdf渲染好的文本",fontChinese));
paragraph.setAlignment(1); //設置文字居中 0靠左 1,居中 2,靠右
paragraph.setIndentationLeft(12); //設置左縮進
paragraph.setIndentationRight(12); //設置右縮進
paragraph.setFirstLineIndent(24); //設置首行縮進
paragraph.setLeading(20f); //行間距
paragraph.setSpacingBefore(5f); //設置段落上空白
paragraph.setSpacingAfter(10f); //設置段落下空白
// 表格
PdfPTable table = createTable(new float[]{60, 40, 40, 40, 50, 60, 60, 120, 40});
table.addCell(createCell("商品名稱", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("商品單價", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("商品數量", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("商品總價", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("商品優惠價", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("商品優惠後總價", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("商品支付金額", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("交易時間", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("交易狀態", keyfont, Element.ALIGN_CENTER));
for (WxDeliveryRecordEntity entity : list) {
table.addCell(createCell(entity.getShopName(), textfont));
table.addCell(createCell(entity.getShopPrice().toString(), textfont));
table.addCell(createCell(entity.getShopNum().toString(), textfont));
table.addCell(createCell(entity.getShopTotalPrice().toString(), textfont));
table.addCell(createCell(entity.getShopDiscountPrice().toString(), textfont));
table.addCell(createCell(entity.getShopNewPrice().toString(), textfont));
table.addCell(createCell(entity.getShopPayPrice().toString(), textfont));
table.addCell(createCell(entity.getShopDeliveryTime().toString(), textfont));
switch (entity.getShopDeliveryFlag()) {
case 1:
table.addCell(createCell("交易正常", textfont));
break;
case 2:
table.addCell(createCell("退單", textfont));
break;
case 3:
table.addCell(createCell("交易異常", textfont));
break;
}
}
// paragraph.add(table);
document.add(paragraph);
document.add(table);
// PdfReportUtils.generatePDF(document, list);
//5,關閉文檔
document.close();
//6,設置請求返回類型
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=shopRecord.pdf");
response.setContentLength(baos.size());
out = response.getOutputStream();
baos.writeTo(out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
} /*finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}*/
}
// 定義全局的字體靜態變量
private static Font titlefont;
private static Font headfont;
private static Font keyfont;
private static Font textfont;
// 最大寬度
private static int maxWidth = 650;
static {
try {
// 不同字體(這裏定義爲同一種字體:包含不同字號、不同style)
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
titlefont = new Font(bfChinese, 16, Font.BOLD);
headfont = new Font(bfChinese, 14, Font.BOLD);
keyfont = new Font(bfChinese, 10, Font.BOLD);
textfont = new Font(bfChinese, 10, Font.NORMAL);
} catch (Exception e) {
e.printStackTrace();
}
}
public static PdfPCell createCell(String value, Font font) {
PdfPCell cell = new PdfPCell();
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
cell.setPhrase(new Phrase(value, font));
return cell;
}
/**
* 創建單元格(指定字體、水平..)
*
* @param value
* @param font
* @param align
* @return
*/
public static PdfPCell createCell(String value, Font font, int align) {
PdfPCell cell = new PdfPCell();
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell.setHorizontalAlignment(align);
cell.setPhrase(new Phrase(value, font));
return cell;
}
/**
* 創建默認列寬,指定列數、水平(居中、右、左)的表格
*
* @param colNumber
* @param align
* @return
*/
public PdfPTable createTable(int colNumber, int align) {
PdfPTable table = new PdfPTable(colNumber);
try {
table.setTotalWidth(maxWidth);
table.setLockedWidth(true);
table.setHorizontalAlignment(align);
table.getDefaultCell().setBorder(1);
} catch (Exception e) {
e.printStackTrace();
}
return table;
}
/**
* 創建指定列寬、列數的表格
*
* @param widths
* @return
*/
public static PdfPTable createTable(float[] widths) {
PdfPTable table = new PdfPTable(widths);
try {
table.setTotalWidth(maxWidth);
table.setLockedWidth(true);
table.setHorizontalAlignment(Element.ALIGN_CENTER);
table.getDefaultCell().setBorder(1);
} catch (Exception e) {
e.printStackTrace();
}
return table;
}
}
總結一下,我是抄了兩篇博客再加上我自己以前用poi做Excel導出的一些思想邏輯!首先我是要做類似於表格那樣的導出,但是客戶需求要導出成PDF的。所以要先畫表格!
PdfPTable table = createTable(new float[]{60, 40, 40, 40, 50, 60, 60, 120, 40});
table.addCell(createCell("商品名稱", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("商品單價", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("商品數量", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("商品總價", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("商品優惠價", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("商品優惠後總價", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("商品支付金額", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("交易時間", keyfont, Element.ALIGN_CENTER));
table.addCell(createCell("交易狀態", keyfont, Element.ALIGN_CENTER));
createTable是自定義的一個方法
/**
* 創建指定列寬、列數的表格
*
* @param widths
* @return
*/
public static PdfPTable createTable(float[] widths) {
PdfPTable table = new PdfPTable(widths);
try {
table.setTotalWidth(maxWidth);
table.setLockedWidth(true);
table.setHorizontalAlignment(Element.ALIGN_CENTER);
table.getDefaultCell().setBorder(1);
} catch (Exception e) {
e.printStackTrace();
}
return table;
}
可以看到這是定義一個數組,裏面放着表格的寬度,要注意總寬度不要大於最大寬度!
控制層:
/**
* 獲取頁面數據,並且把數據導出到pdf裏
* @param entity
* @return
* @throws Exception
*/
@RequestMapping(params = "exportPdf")
@ResponseBody
public List<WxDeliveryRecordEntity> getDeliveryRecordList(WxDeliveryRecordEntity entity,HttpServletResponse response) throws Exception {
List<WxDeliveryRecordEntity> list = wxDeliveryRecordService.getDeliveryRecordList(entity);
PdfReportUtils.exportPdf(response,list);
return list;
}
我這個用的持久層是hibernate,總是你把數據封裝到集合裏然後傳到工具類裏面,然後去瀏覽器訪問你寫的接口,他就會下載了!