poi实现excel导出
准备工作
poi-3.17.jar
新建Dynamic Web Project.
复制poi-3.17.jar包到/WebContent/WEB-INF/lib下,右键Build Path->Add to Build Path
poi示例
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
public class demoPoi {
public static void main(String[] args) throws Exception {
/**
* poi简单示例
*/
Workbook wb = new HSSFWorkbook();
Sheet sheet= wb.createSheet("第一个Sheet页");
Row row = sheet.createRow(0); //创建一个行
Cell cell = row.createCell(0); //创建一个列 第1列
cell.setCellValue(1);
row.createCell(1).setCellValue(1.2); //创建一个单元格 第2列值是1.2
row.createCell(2).setCellValue("这是一个字符串类型"); //创建一个单元格 第3列 值为一个字符串
row.createCell(3).setCellValue(false); //创建一个单元格 第4列 值为布尔类型
FileOutputStream fileOut =new FileOutputStream("C:\\Users\\boolean\\Desktop\\UAP\\a.xls");
wb.write(fileOut);
fileOut.close();
}
}
模拟数据
1、首先模拟从数据库中查询出多条数据。为了之后取key值做表头与数据匹配不乱序,用LinkedHashMap存储每行数据。
/**
* 模拟数据
*/
LinkedHashMap<String,Object> map1 = new LinkedHashMap();
map1.put("名称", "赵子龙");
map1.put("金额", "200元");
map1.put("日期", "2020-09-06 20:19:03");
LinkedHashMap<String,Object> map2 = new LinkedHashMap();
map2.put("名称", "张飞");
map2.put("金额", null);
map2.put("日期", "2020-09-06 20:19:03");
List<LinkedHashMap<String,Object>> list = new ArrayList<LinkedHashMap<String,Object>>();
list.add(map1);
list.add(map2);
实现
2、创建excel对象,创建Sheet,创建行,从结果集取出Keys集合作为表头,按列循环写入excel文件第一行,表头是每条数据Map的Key值(为了根据不同sql动态生成表头)
3、遍历数据项的values集合,按列从左往右,按行从左往右写入excel。
4、创建excel文件流,写入数据,关闭文件流。
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
public class demo {
public static void main(String[] args) throws IOException {
/**
* 模拟数据
*/
LinkedHashMap<String,Object> map1 = new LinkedHashMap();
map1.put("名称", "赵子龙");
map1.put("金额", "200元");
map1.put("日期", "2020-09-06 20:19:03");
LinkedHashMap<String,Object> map2 = new LinkedHashMap();
map2.put("名称", "张飞");
map2.put("金额", null);
map2.put("日期", "2020-09-06 20:19:03");
List<LinkedHashMap<String,Object>> list = new ArrayList<LinkedHashMap<String,Object>>();
list.add(map1);
list.add(map2);
/**
* 创建excel文件
*/
Workbook wb = new HSSFWorkbook();
/**
* 创建Sheet页
*/
Sheet sheet= wb.createSheet("第一个Sheet页");
/**
* 创建行
*/
Row row = sheet.createRow(0);
/**
* 记录行号
*/
int i = 0;
/**
* 打印表头
*/
for(String str : list.get(0).keySet()){
System.out.println(str);
/**
* 创建列
*/
row.createCell(i).setCellValue(str);
i++;
}
/**
* 打印数据,j表示list数据项大小,j+1表示行号,因为表头占了一行,所以行号是j+1
*/
for (int j = 0; j < list.size(); j++) {
Row rowData = sheet.createRow(j+1);
for (int k = 0; k < list.get(j).values().size(); k++) {
Cell cellData = rowData.createCell(k);
//特殊情况,过滤数据为空
if(list.get(j).values().toArray()[k]!=null) {
cellData.setCellValue(list.get(j).values().toArray()[k].toString());
}
}
}
/**
* 创建excel并写入数据
*/
FileOutputStream fileOut =new FileOutputStream("C:\\Users\\boolean\\Desktop\\UAP\\a.xls");
wb.write(fileOut);
fileOut.close();
}
}