版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liang_wf/article/details/83618263
使用jxl根据下载数据模版导出excel表——合并配置:
首先根据模版文件路径读取excel模版文件,然后对excel文件进行修改,即写出数据到excel文件中,再将该excel文件保存到目标文件中,这里操作excel必须是2003版本(.xls)
- 准备excel模版文件
- 调用JxlUtil.java类的方法代码
/**
* 导出excel表
*
*/
public void download(HttpServletRequest request, HttpServletResponse response) {
try {
String wdir = request.getSession().getServletContext().getRealPath("");
String tempname = "test";
String dlFile = "/files/tmp/" + DateTimeUtil.getCurDateTime("yyyyMMdd") + "/"
+ tempname + System.nanoTime() + ".xls";// 临时文件目录
String opTemp = wdir + "/files/temp/" + tempname + ".xls";// 导出数据模板文件的路径
// 创建保存写出excel表的数据
Map<String, Object> map = new HashMap<String, Object>();
map.put("outPutDate", DateTimeUtil.getCurDateTime("yyyy-MM-dd"));
// 从数据库查询的数据列表
List<Map<String, Object>> dataList = new ArrayList<Map<String,Object>>();
map.put("dataList", dataList);
// 合并配置
Properties p = new Properties();
p.setProperty("mergeKey", "key1,key2");// 按哪几列的数据进行合并
p.setProperty("mergeCol", "4");// 合并哪几列
boolean wb = false;
wb = JxlUtil.wrireExcel(map, wdir + dlFile, opTemp, p);
if (!wb) {
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8;");
response.getWriter().print("<script>window.top.alert('下载文件失败,请稍后再试,谢谢。');</script>");
} else {
String basePath = request.getScheme() + "://" + request.getServerName() + ":"
+ request.getServerPort();
response.getWriter().print("<script>window.location.href='" + basePath + dlFile + "';</script>");
}
} catch (IOException e) {
e.printStackTrace();
}
}
- JxlUtil.java类写出excel(合并配置)方法代码
/**
* 写excel方法
*
* @param dataMap 数据存放
* @param dlFile 下载数据模板文件的地址
* @param opTempFile 导出文件的地址
* @param mergecfg 合并的配置(只支持纵向合并):mergeKey 指定按哪一列的数据进行合并;
* mergeCol 指定合并哪几列(格式1,2,3,4....)
* @return
*/
public static boolean wrireExcel(Map<String, Object> dataMap, String dlFile,
String opTempFile, Properties mergecfg) {
Workbook workbook = null;
WritableWorkbook wwb = null;
WritableSheet ws = null;
Label lcontent = null;
WorkbookSettings seting = new WorkbookSettings();
int sheetIndex = 0;
try {
if (mergecfg == null) {
mergecfg = new Properties();
}
String tmpDir = dlFile.substring(0, dlFile.lastIndexOf("/"));
File xdDlFile = new File(tmpDir);
if (!xdDlFile.exists()) {
xdDlFile.mkdirs();
}
seting.setWriteAccess(null);
workbook = Workbook.getWorkbook(new File(opTempFile));//根据模版文件获取工作薄
wwb = Workbook.createWorkbook(new File(dlFile), workbook, seting);//创建写工作薄
ws = wwb.getSheet(sheetIndex);//创建写工作表
ws.getSettings().setSelected(true);
int rows = ws.getRows();
Map<String, Integer[]> tbidcountmap = new HashMap<String, Integer[]>();
for (int i = 0; i < rows; i++) {
Cell[] keyCells = ws.getRow(i);
if (keyCells != null) {
for (int j = 0; j < keyCells.length; j++) {
String cellContent = keyCells[j].getContents();
if (cellContent != null && !"".equals(cellContent)) {
if (dataMap != null) {
// 处理循环
if (cellContent.indexOf("${loop ") >= 0)
boolean ischange = false;
Cell[] cells = ws.getRow(i + 2);
String elp = "";
if (cells != null) {
elp = cells[j].getContents();
}
if (elp != null && !"".equals(elp) && elp.indexOf("${end loop}") >= 0) {
cellContent = cellContent.replaceAll("\\$\\{loop ", "")
.replaceAll("\\}", "");
List<Map<String, Object>> list = (List<Map<String, Object>>) dataMap
.get(cellContent);
cells = ws.getRow(i + 1);//输出的keys值
if (list != null) {
for (int k = 0; k < list.size(); k++) {
ws.insertRow(i + (k + 1));
// 处理合并配置 第1步
if (mergecfg.containsKey("mergeKey")
&& mergecfg.containsKey("mergeCol")) {
String keys = mergecfg.get("mergeKey").toString();
String bkid = (String) list.get(k).get(keys.split(",")[0]);
String tuserid = (String) list.get(k).get(keys.split(",")[1]);
if (bkid != null && !"".equals(bkid)) {
if (tbidcountmap.containsKey(bkid + "," + tuserid)) {
Integer[] rc = tbidcountmap.get(bkid + "," + tuserid);
rc[1] = rc[1] + 1;
tbidcountmap.put(bkid + "," + tuserid, rc);
} else {
Integer[] rc = { i + k, 1 }; // 哪一行开始到哪一行结束
tbidcountmap.put(bkid + "," + tuserid, rc);
}
}
keys = null;
bkid = null;
tuserid = null;
}
for (int l = 0; l < cells.length; l++) {
Iterator<String> kit = list.get(k).keySet().iterator();
elp = cells[l].getContents();
boolean iskey = false;
if (elp != null && !"".equals(elp)) {
while (kit.hasNext()) {
String key = kit.next();
if (elp.indexOf("${" + key + "}") >= 0) {
iskey = true;
elp = list.get(k).get(key) + "";
}
key = null;
}
if (!iskey) {
elp = "";
}
lcontent = new Label(l, (i + (k + 1)), elp);
lcontent.setCellFormat(cells[l]
.getCellFormat());
ws.addCell(lcontent);
}
kit = null;
}
}
ws.removeRow(i);
ws.removeRow(i + list.size());
ws.removeRow(i + list.size());
i = i + list.size() - 2;// 从列表的后一行开始
rows = rows + list.size() - 3;// 行数也增加
ischange = true;
}
list = null;
}
if (!ischange) {
ws.removeRow(i);
ws.removeRow(i);
ws.removeRow(i);
rows = rows - 3;
}
cells = null;
} else {
// 处理非循环列表
Iterator<String> it = dataMap.keySet().iterator();
while (it.hasNext()) {
String key = it.next();
if (cellContent.indexOf("${" + key + "}") >= 0) {
cellContent = cellContent.replaceAll("\\$\\{" + key + "\\}",
dataMap.get(key) + "");
}
key = null;
}
lcontent = new Label(j, i, cellContent);
lcontent.setCellFormat(keyCells[j].getCellFormat());
ws.addCell(lcontent);
it = null;
}
}
}
cellContent = null;
}
}
keyCells = null;
}
// 处理合并配置 第2步
if (mergecfg.containsKey("mergeKey") && mergecfg.containsKey("mergeCol")) {
String mergeCol = mergecfg.getProperty("mergeCol");
String[] mcs = mergeCol.split(",");
Iterator<Integer[]> mitList = tbidcountmap.values().iterator();
while (mitList.hasNext()) {
Integer[] rc = mitList.next();
if (rc[1] > 1) {
for (int i = 0; i < mcs.length; i++) {
Integer m = Integer.parseInt(mcs[i]);
ws.mergeCells(m, rc[0], m, rc[0] + rc[1] - 1);
}
}
rc = null;
}
mergeCol = null;
mcs = null;
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
try {
wwb.write();
wwb.close();
} catch (Exception e) {
e.printStackTrace();
}
if (workbook != null) {
workbook.close();
}
}
}