java后台处理excel_java后台利用Apache poi 生成excel文档提供前台下载示例
之前在項目中會用到在java在后臺把數(shù)據(jù)填入Word文檔的模板來提供前臺下載,為了自己能隨時查看當時的實現(xiàn)方案及方便他人學習我寫了這篇博客,訪問量已經(jīng)是我寫的博客里第一了。于是乎我在學會用Java在后臺利用Apache poi 生成excel文檔提供前臺下載之后就想著來寫一篇姊妹篇啦。
在生成Excel文檔的時候我采用了和生成Word時的不同方法,Apache poi。它是用Java編寫的免費開源的跨平臺的 Java API,提供API給Java程式對Microsoft Office格式檔案讀和寫的功能。想要實現(xiàn)這個功能,就按照下面的步驟來做吧,為了方便起見,我直接拿項目中遇到的實例來舉例說明,是的,我在寫這篇博客的時候同時也在完成手上的項目。
step1:創(chuàng)建xls格式的模板
表頭含有我的甲方信息就打碼了,可以看到我搞了一個空的模板文件,現(xiàn)在有很多東西需要在后臺填入
step2:前臺觸發(fā)事件
搞一個按鈕,用戶點擊的時候用javascript的window.location.href將頁面重定向到你處理下載的URL去
比方說,這是我項目的前臺,看到那個表面質量按鈕嗎,來看一下當它被點擊的時候調用的函數(shù)
function exportBatch() {
//get請求,可以傳遞參數(shù),比方說我這里就傳了一堆卷號,我只生成傳過去的這堆卷號的檢驗記錄
//參數(shù)rollNumbers的細節(jié)就不展示了,業(yè)務相關
window.location.href = '../ir/exportSurface?rollNumberList=' + rollNumbers;
}
有朋友可能想用什么Ajax來發(fā)送請求,我反正是沒搞出來,挺麻煩的,網(wǎng)上找的相關解決方案也都比較蛋疼,因此不傳什么復雜的敏感的參數(shù),就這么寫就可以。
step3:后臺處理
首先你當然要把Apache poi那一套東西引入你的項目啦,我的項目是Maven項目,添加依賴很容易
org.apache.poi
poi
3.14
然后,為了方便導出Excel,在項目中建了一個ExcelUtils工具類,后面給出源碼,這么一來導出Excel會變得更簡單。ExcelUtils里面rXogrNBYP除了一些既定的方法外,還有就是你具體怎么去操作模板的方法了。當然你用的少的話可以不用我這工具類,而是在你需要的時候import相關的類,然后在你處理的時候就把操作模板的邏輯寫進去也可以。但我這個項目很多次用到導出Excel,所以抽象出一個工具類是很有必要的,符合設計模式。
我的項目是基于SpringMVC的,來看看我后臺接收到請求以后做了些什么吧
Controller:
/***
* 批量導出表面質量檢驗記錄
*
* @return
* @throws Exception
*/
@RequestMapping(value = "exportSurface", method = RequestMethod.GET)
@ResponseBody
public void exportSurface(HttpServletRequest request,
HttpServletResponse response) throws Exception {
//參數(shù)獲取及處理,業(yè)務相關不展示
//把要填寫的數(shù)據(jù)放在一個map里
Map map = new HashMap();
map.put("sequence", "0001");//mock編號
map.put("date", DateUtils.toDateStr(new Date(), DateUtils.DEFAULT_DATE_PATTERN_CHINES
最后調用ExcelUtils里的相關導出方法,這個方法是自定義的,它定義的是怎樣去操作模板
自定義的方法:
public static void exportInspectionRecordSurface(HttpServletRequest request, HttpServletResponse response, Map map) throws IOException {
//模板的路徑,這個在自己的項目中很容易弄錯,相對位置一定要寫對啊
String prXogrNBYPsth = request.getRealPath("/") + INSPECTIONRECORD_SURFACE_TEMPLET_PATH;
Workbook webBook = readExcel(psth);
createCellStyle(webBook);
Sheet sheet = webBook.getSheetAt(0);
//開始操作模板,找到某行某列(某個cell),需要注意的是這里有個坑,行和列的計數(shù)都是從0開始的
//一次數(shù)據(jù)插入的位置不對,別灰心,多試幾次就好啦,你要是能看懂我下面的代碼,數(shù)據(jù)插在了什么位置,你就明白了
int rows = 1;
Row row = sheet.getRow(rows);
row.createCell(1).setCellValue((String) map.get("sequence"));
row.createCell(3).setCellValue((String) map.get("date"));
row.createCell(9).setCellValue((String) map.get("chetaihao"));
rows = 2;
row = sheet.getRow(rows);
row.createCell(1).setCellValue((String) map.get("productName"));
row.createCell(3).setCellValue((String) map.get("specification"));
row.createCell(9).setCellValue((String) map.get("memo"));
//檢驗記錄的插入業(yè)務相關,不展示,其實就是for循環(huán)在合適的行合適的列插入一個個對象的屬性即可,你這么聰明,沒問題的
writeExcel(response, webBook, "表面質量檢驗記錄");
}
ExcelUtils:
//這里得有你自己的package名
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Created by bwju on 2016/12/06.
*/
public class ExcelUtils {
private static final String INSPECTIONRECORD_SURFACE_TEMPLET_PATH = "/asserts/templete/InspectionRecordSurface.xls";
private static HSSFCellStyle cellstyle = null;
public static void exportInspectionRecordSurface(HttpServletRequest request, HttpServletResponse response, Map map) throws IOException {
//實現(xiàn)上文里有,改個函數(shù)名,寫你的操作模板函數(shù)吧!
}
private static Workbook readExcel(String filePath) {
InputStream in = null;
Workbook work = null;
try {
in = new FileInputStream(filePath);
work = new HSSFWorkbook(in);
} catch (FileNotFoundException e) {
System.out.println("文件路徑錯誤");
e.printStackTrace();
} catch (IOException e) {
System.out.println("文件輸入流錯誤");
e.printStackTrace();
}
return work;
}rXogrNBYP
private static void writeExcel(HttpServletResponse response, Workbook work, String fileName) throws IOException {
OutputStream out = null;
try {
out = response.getOutputStream();
response.setContentType("application/ms-excel;charset=UTF-8");
response.setHeader("Content-Disposition", "attachment;filename="
.concat(String.valueOf(URLEncoder.encode(fileName + ".xls", "UTF-8"))));
work.write(out);
} catch (IOException e) {
System.out.println("輸出流錯誤");
e.printStackTrace();
} finally {
out.close();
}
}
private static Cell setCellStyleWithStyleAndValue(CellStyle style, Cell cell, String value) {
cell.setCellStyle(style);
cell.setCellValue(value);
return cell;
}
private static Cell setCellStyleWithValue(Cell cell, String value) {
cell.setCellStyle(cellstyle);
cell.setCellValue(value);
return cell;
}
private static Cell setCellStyleWithStyleAndValue(CellStyle style, Cell cell, RichTextString value) {
cell.setCellStyle(style);
cell.setCellValue(value);
return cell;
}
private static Cell setCellStyleWithValue(Cell cell, int value) {
cell.setCellStyle(cellstyle);
cell.setCellValue(value);
return cell;
}
private static Cell setCellStyleWithValue(Cell cell, double value) {
cell.setCellStyle(cellstyle);
cell.setCellValue(value);
return cell;
}
private static HSSFCellStyle createCellStyle(Workbook wb) {
cellstyle = (HSSFCellStyle) wb.createCellStyle();
cellstyle.setAlignment(HSSFCellStyle.ALIGN_CENwww.cppcns.comTER);
cellstyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
cellstyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
cellstyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
cellstyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
cellstyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
return cellstyle;
}
}
step4:啟動項目,然后測試一下,看!完美的導出了。。。有圖為證
嗯嗯,文章寫到這里就結束啦,Apache poi還提供了很多API在本例中為得到展示,比如能夠指定樣式等等。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持我們。
本文標題: java后臺利用Apache poi 生成excel文檔提供前臺下載示例
本文地址: http://www.cppcns.com/ruanjian/java/190786.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結
以上是生活随笔為你收集整理的java后台处理excel_java后台利用Apache poi 生成excel文档提供前台下载示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么在Windows 11中为音频输出选
- 下一篇: Win7旗舰版系统网页显示不全怎么办