前言
? ?在項目開發(fā)中,我們會遇到各種文件導出的開發(fā)場景,但是這種情況并都不常用,于是本人將自己工作中所用的代碼封裝成工具類,旨在記錄工具類使用方法和技術(shù)分享。
一、Jxls的簡介
? ?Jxls是一個簡單的、輕量級的excel導出庫,使用特定的標記在excel模板文件中來定義輸出格式和布局。Java中成熟的excel導出工具備Pol、Jxl,但他們都是使用java代碼的方式來導出Excel,編碼效率很低且不方便維護。
二、快速開始
1、導入依賴
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls</artifactId>
<version>2.4.6</version>
</dependency>
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-poi</artifactId>
<version>1.0.12</version>
</dependency>
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-jexcel</artifactId>
<version>1.0.6</version>
</dependency>
2、定義導出的模板
? ?導入依賴后,我們導出需要使用到模板,我們要先用word建立一個xlsx的模板(切記:新建excel工作表要使用xlsx格式,不要使用xls格式,因為使用xls導出的時候xlsx表格數(shù)據(jù)有可能會有問題)
建立好xlsx工作表了就根據(jù)實際需求的頁面在xlsx表格上把需要的導出的框架畫出來就可,賦值就要使用表達式了,表達式可以查看官網(wǎng)也可以查看我下方寫的。官方網(wǎng)址,模板弄好之后,需要放在resource目錄下,在Java中進行讀取,下面代碼中有具體實現(xiàn)。
如何寫表達式,在工作表中右鍵插入批注,office中添加批注快捷鍵(Shit + F2)
jx:each(items="${collection}" var="item" lastCell="A3")
其中items是你傳入的集合的名稱,var是集合中每個對象的別名,lastCell是循環(huán)最后的位置
jx:area(lastCell="H3")
這里設(shè)置標題范圍,最寬到H3
模板表達式
簡單列舉常用的幾個表達式
(1)單個值的注入:
${variable},variable是你傳入的參數(shù)的key
(2)迭代循環(huán)注入:
jx:each(items="${collection}" var="item" lastCell="A3")
其中items是你傳入的集合的名稱,var是集合中每個對象的別名,lastCell是循環(huán)最后的位置
(3)條件判斷:
jx:if test="${condition}"? ?條件為真時執(zhí)行的內(nèi)容
(4)合并單元格:
jx:mergeCells(lastCell="合并單元格范圍" [, cols="合并的列數(shù)"] [, rows="合并的行數(shù)"] [, minCols="要合并的最小列數(shù)"] [, minRows="要合并的最小行數(shù)"])
3、使用工具類
package com.sansint.industry.utils;
import org.jxls.common.Context;
import org.jxls.expression.JexlExpressionEvaluator;
import org.jxls.transform.Transformer;
import org.jxls.transform.poi.PoiTransformer;
import org.jxls.util.JxlsHelper;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
/**
* @author DongJiYong
* jxls工具類
*/
public class JxlsUtils {
/**
* 模板導出
*
* @param is
* @param os
* @param model
* @throws IOException
*/
public static void exportExcel(InputStream is, OutputStream os, Map<String, Object> model) throws IOException {
Context context = PoiTransformer.createInitialContext();
if (model != null) {
for (Map.Entry<String, Object> Entry : model.entrySet()) {
context.putVar(Entry.getKey(), Entry.getValue());
}
}
JxlsHelper jxlsHelper = JxlsHelper.getInstance();
Transformer transformer = jxlsHelper.createTransformer(is, os);
//獲得配置
JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) transformer.getTransformationConfig().getExpressionEvaluator();
//設(shè)置靜默模式,不報警告
evaluator.getJexlEngine().setSilent(true);
//函數(shù)強制,自定義功能
Map<String, Object> funcs = new HashMap<>();
funcs.put("utils", new JxlsUtils());
evaluator.getJexlEngine().setFunctions(funcs);
//必須要這個,否則表格函數(shù)統(tǒng)計會錯亂
jxlsHelper.setUseFastFormulaProcessor(false).processTemplate(context, transformer);
}
/**
* 導出excel
*
* @param templatePath
* @param os
* @param model
* @throws Exception
*/
public static void exportExcel(String templatePath, OutputStream os, Map<String, Object> model) throws Exception {
File template = getTemplate(templatePath);
if (template != null) {
exportExcel(new FileInputStream(template), os, model);
} else {
throw new Exception("Excel 模板未找到。");
}
}
/**
* 獲取jxls模板
*
* @param path
* @return
*/
public static File getTemplate(String path) {
File template = new File(path);
if (template.exists()) {
return template;
}
return null;
}
/**
* 設(shè)置響應(yīng)頭、文件名
*
* @param response
* @param fileName
* @throws UnsupportedEncodingException
*/
public static void setResponse(HttpServletResponse response, String fileName) throws UnsupportedEncodingException {
fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("UTF-8");
}
}
4、Controller層代碼文章來源:http://www.zghlxwxcb.cn/news/detail-777380.html
使用該工具類主要在Controller層或者Service層封裝好導出的數(shù)據(jù)和導出流即可,本人是在Controller層進行封裝的數(shù)據(jù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-777380.html
/***
* excel導出
* @param request
* @param sanSintUser
*/
@GetMapping("/excel")
public void excelDownload(ParamRequest request, SanSintUser sanSintUser, HttpServletResponse response) {
try {
//根據(jù)定義的excel模板 構(gòu)建導出的數(shù)據(jù)
Map<String, Object> map = buildData(request, sanSintUser);
//設(shè)置導出流
JxlsUtils.setResponse(response, "能源檔案信息");
// 獲取excel模版路徑
InputStream tplIs = Thread.currentThread().getContextClassLoader().getResourceAsStream("template/檔案列表.xlsx");
JxlsUtils.exportExcel(tplIs, response.getOutputStream(), map);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private Map<String, Object> buildData(ParamRequest request, SanSintUser sanSintUser) {
Map<String, Object> map = new HashMap<>();
List<Map<String, Object>> energyFileExcelList = new ArrayList<>();
//從數(shù)據(jù)庫查詢出的數(shù)據(jù)集合
List<EnergyFile> list = new ArrayList<>();
if (!CollectionUtils.isEmpty(request.getIds())) {
//如果有id,則查詢id對應(yīng)的能源檔案信息
list = energyFileService.selectEnergyFileByIds(request.getIds());
} else {
//如果沒有id,則查詢?nèi)磕茉礄n案信息
EnergyFile energyFile = new EnergyFile();
energyFile.setTenantId(sanSintUser.getTenantId());
list = energyFileService.selectEnergy(energyFile);
}
//構(gòu)建excel數(shù)據(jù)
for (int i = 0; i < list.size(); i++) {
EnergyFile energyFile = list.get(i);
Map<String, Object> dataMap = new LinkedHashMap<>();
dataMap.put("num", i + 1);
dataMap.put("categoryName", energyFile.getCategoryName());
dataMap.put("itemName", energyFile.getItemName());
dataMap.put("fileName", energyFile.getFileName());
String fileType = buildFileType(energyFile);
dataMap.put("fileType", fileType);
String createUserName = energyFileService.selectCreateUserNameByUserId(energyFile.getCreateUser());
dataMap.put("createUserStr", createUserName);
dataMap.put("createTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(energyFile.getCreateTime()));
dataMap.put("deptName", energyFile.getDeptName());
dataMap.put("jobName", energyFile.getJobName());
dataMap.put("fileUrl", energyFile.getFileUrl());
energyFileExcelList.add(dataMap);
}
到了這里,關(guān)于Java中使用JXLS工具類導出復雜Excel表格的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!