poi导出excel表格
程序员文章站
2024-01-03 21:12:34
...
刚入职不到一个月,前几天产品姐让做一个导出excel表格到的功能。以前在学校从来没有接触过,一脸懵逼。但是任务得完成啊。就从网上查java导出excel怎么做,然后就找到了poi。
首先,去apache官网下载poi使用的jar包。
代码如下:
util方法:
package com.mx.util;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
public class Export {
public void export(String fileName, List<String> header1, List<String> header2, List<Map<String, Object>> listmap,
List<Map<String, Object>> jyqmap, OutputStream out) {
// 声明一个工作簿
HSSFWorkbook wb = new HSSFWorkbook();
// 生成一个表格
HSSFSheet sheet = wb.createSheet(fileName);
// 生成表格的第一行
// 第一行表头
HSSFRow row = sheet.createRow(0);
for (int i = 0; i < header1.size(); i++) {
sheet.autoSizeColumn(i, true);// 根据字段长度自动调整列的宽度
HSSFCell cell = row.createCell(i);
cell.setCellValue(header1.get(i));
if (i >= 0 && i < header1.size()) {
for (int j = 0; j < header1.size(); j++) {
// 从第j列开始填充
cell = row.createCell(j);
cell.setCellValue(header1.get(j));
}
}
}
// 第二行表头
row = sheet.createRow(1);
for (int i = 0; i < header2.size(); i++) {
sheet.autoSizeColumn(i, true);// 自动调整宽度
HSSFCell cell = row.createCell(i + 3);
cell.setCellValue(header2.get(i));
if (i >= 2 && i <= 18) {
for (int j = 0; j < header2.size(); j++) {
// 从第j+1列开始填充
cell = row.createCell(j + 3);
cell.setCellValue(header2.get(j));
}
}
}
// 第三行数据
Iterator<Map<String, Object>> data = listmap.iterator();// 总记录的迭代器
Iterator<Map<String, Object>> jyq = jyqmap.iterator();// 建设期的迭代器
int i = 0;
int j = 0;
int m = 3;
while (data.hasNext()) {
Map<String, Object> mapTemp = data.next();// 拿到一条记录
row = sheet.createRow(i + 2);// 从第三行填数据
Iterator<String> bt1 = header1.iterator();// 迭代第一行表头
while (bt1.hasNext()) {// 第一行表头有值,进行操作
String bt1Str = bt1.next();// 表头一字段的暂存
HSSFCell cell = row.createCell(j);// 创建列
cell.setCellValue((String) mapTemp.get(bt1Str));// 导入对应列的数据
j++;
}
i++;// 移动行
}
while (jyq.hasNext()) {
Map<String, Object> jyqData = jyq.next();// 拿到一条经营期记录
row = sheet.createRow(j + 2);// 从第三行填数据
Iterator<String> bt2 = header2.iterator();// 迭代第二行表头
while (bt2.hasNext()) {// 有值,进行操作
String bt2Str = bt2.next();// 表头二字段的暂存
HSSFCell cell = row.createCell(m);
cell.setCellValue((String) jyqData.get(bt2Str));
m++;
}
j++;// 移动行
}
try {
wb.write(out);
out.close();
System.out.println("导出成功!");
} catch (FileNotFoundException e) {
System.out.println("导出失败!");
e.printStackTrace();
} catch (IOException e) {
System.out.println("导出失败!");
e.printStackTrace();
}
}
}
service层:
/**
* 导出表格
*
* @param planPro
*/
public void excel(HttpServletResponse response, ProjectPlan planPro) {
String fileName = "投资计划与资金筹措表" + ".xls";
// 进行查询并导出
List<ProjectPlan> list = this.getProFinanceDataList(planPro);
int jyq = (Integer) this.getDao().queryForObject(NAMESPACE + "selJyqCount", planPro);
// 第一行表头
List<String> header1 = new ArrayList<String>();
header1.add("序号");
header1.add("项目");
header1.add("合计");
header1.add("建设期");
// 第二行头
List<String> header2 = new ArrayList<String>();
for (int i = 1; i < jyq + 1; i++) {
header2.add("第" + i + "年");
}
if (list != null && list.size() > 0) {// 查询的数据不为空就对数据进行导出
List<Map<String, Object>> listmap = new ArrayList<>();
List<Map<String, Object>> jyqmap = new ArrayList<>();
JSONObject json;
for (ProjectPlan r : list) {// 循环每一条数据
Map<String, Object> mapZ = new HashMap<>();
mapZ.put("序号", r.getSerialXh());
mapZ.put("项目", r.getXmmc());
mapZ.put("合计", r.getSumData());
mapZ.put("建设期", "");
json = JSONObject.fromObject(r);
Map<String, Object> mapF = new HashMap<>();
for (int i = 1; i < jyq + 1; i++) {
mapF.put(header2.get(i - 1), json.get("jsq" + i));
}
// 数据添加到excel表格
listmap.add(mapZ);
jyqmap.add(mapF);
}
// 使用流将数据导出
OutputStream out = null;
try {
// 防止中文乱码
String headStr = "attachment; filename=\"" + new String(fileName.getBytes("gb2312"), "ISO8859-1") + "\"";
response.setContentType("octets/stream");
response.setContentType("APPLICATION/OCTET-STREAM");
response.setHeader("Content-Disposition", headStr);
out = response.getOutputStream();
Export exportUtil = new Export();
exportUtil.export(fileName, header1, header2, listmap, jyqmap, out);
} catch (Exception e) {
e.printStackTrace();
}
}
}
最后结果: