简单的POI导出JSP页面表格数据到excel

时间:2021-10-20 17:08:33

数据库中的equipment表格数据:

简单的POI导出JSP页面表格数据到excel

读取数据库中表格数据的代码TestExcel.java

public class TestExcel extends BaseAction{

/**
* @param args
* @throws Exception
*/
public String excel() {
try{
Connection connection = con();
String sql = "select * from equipment";
PreparedStatement ps = pre(sql, connection);
ResultSet rs = ps.executeQuery();
String [] string = {"设备编号","学院名称","入库时间","实验室位置","实验箱名称","使用状态"};
ArrayList listname = new ArrayList();
for(int i = 0;i< string.length;i++){
listname.add(string[i]);
}
// ArrayList listname = (ArrayList) Arrays.asList(string);
ArrayList listData = new ArrayList();
while(rs.next()){
ArrayList list = new ArrayList();
list.add(rs.getString(1));
list.add(rs.getString(2));
list.add(rs.getTimestamp(3));
list.add(rs.getString(4));
list.add(rs.getString(5));
list.add(rs.getString(6));
listData.add(list);
}
OutputStream out = response.getOutputStream();
//重置输出流
response.reset();
//设置导出Excel报表的导出形式
response.setContentType("application/vnd.ms-excel");
//设置下载的excel文件名称
response.setHeader("Content-Disposition", "attachment;filename=zfc.xls");
ExcelFileGenerator ex = new ExcelFileGenerator(listname,listData);
ex.expordExcel(out);
//设置输出形式
System.setOut(new PrintStream(out));
//刷新输出流
out.flush();
//关闭输出流
if(out!=null){
out.close();
}
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return null;
}
public static Connection con() throws Exception{
Connection connection = null;
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/ems", "root", "123456");
return connection;
}

public static PreparedStatement pre(String sql,Connection connection) throws Exception{
PreparedStatement ps = null;
ps = connection.prepareStatement(sql);
return ps;
}

}

将list集合的中的数据导入到excel表中的步骤如下:

 * 1、创建 HSSFWorkBook对象
* 2、获取要导出的表格的总记录数
* 3、根据总记录和每个excels的所容纳的记录数,进行分页处理,得出分为几个sheet的excels
* 4、得出sheet,进行每个sheet的循环处理
*      4.1、通过workbook对象进行创建createSheet,HSSFSheet对象
*      4.2、拥有了HSSFSheet对象,创建sheet.createRow行表头,单独的一行即数据说明
*      4.3、创建表头行HSSFRow,开始导入表头行数据,开始对表头这一行进行数据循环填充
*              4.3.1、通过行头对象HSSFRow创建HSSFCell列对象
*              4.3.2、有列对象,可以设置显示的样式,单元格宽度通过sheet对象设置
*              4.3.3、列对象设置完了,可以进行值的填充cell.setValue
*       4.4、接着开始循环每一行数据,对总记录进行循环,如果超过最大容量,那么最大值就是它,否则就是实际记录数
*       4.5、开始进入循环,然后都要创建一个行对象HSSFRow,根据现在的页数取出第几条数据集合,进行循环
*               4.5.1、也是通过HSSFRow,创建HSSFCell列对象
*               4.5.2、通过cell对象设置相应的样式或者编码
*               4.5.3、编码设置完,就可以进行每列数据的填充
* 5、返回workBook对象


代码ExcelFileGenerator.java:

public class ExcelFileGenerator {

private final int SPLIT_COUNT = 1500; //Excel每个工作簿的行数

private ArrayList fieldName = null; //excel标题数据集

private ArrayList fieldData = null; //excel数据内容

private HSSFWorkbook workBook = null;

/**
* 构造器
* @param fieldName 结果集的字段名
* @param data
*/
public ExcelFileGenerator(ArrayList fieldName, ArrayList fieldData) {

this.fieldName = fieldName;
this.fieldData = fieldData;
}

/**
* 1、创建 HSSFWorkBook对象
* 2、获取要导出的表格的总记录数
* 3、根据总记录和每个excels的所容纳的记录数,进行分页处理,得出分为几个sheet的excels
* 4、得出sheet,进行每个sheet的循环处理
* 4.1、通过workbook对象进行创建createSheet,HSSFSheet对象
* 4.2、拥有了HSSFSheet对象,创建sheet.createRow行表头,单独的一行即数据说明
* 4.3、创建表头行HSSFRow,开始导入表头行数据,开始对表头这一行进行数据循环填充
* 4.3.1、通过行头对象HSSFRow创建HSSFCell列对象
* 4.3.2、有列对象,可以设置显示的样式,单元格宽度通过sheet对象设置
* 4.3.3、列对象设置完了,可以进行值的填充cell.setValue
* 4.4、接着开始循环每一行数据,对总记录进行循环,如果超过最大容量,那么最大值就是它,否则就是实际记录数
* 4.5、开始进入循环,然后都要创建一个行对象HSSFRow,根据现在的页数取出第几条数据集合,进行循环
* 4.5.1、也是通过HSSFRow,创建HSSFCell列对象
* 4.5.2、通过cell对象设置相应的样式或者编码
* 4.5.3、编码设置完,就可以进行每列数据的填充
* 5、返回workBook对象
* 创建HSSFWorkbook对象
* @return HSSFWorkbook
*/
public HSSFWorkbook createWorkbook() {

workBook = new HSSFWorkbook();
int rows = fieldData.size();
int sheetNum = 0;

if (rows % SPLIT_COUNT == 0) {
sheetNum = rows / SPLIT_COUNT;
} else {
sheetNum = rows / SPLIT_COUNT + 1;
}

for (int i = 1; i <= sheetNum; i++) {
HSSFSheet sheet = workBook.createSheet("Page " + i);
HSSFRow headRow = sheet.createRow((short) 0);
for (int j = 0; j < fieldName.size(); j++) {
HSSFCell cell = headRow.createCell((short) j);
//添加样式
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
//添加样式
//设置所有单元格的宽度
sheet.setColumnWidth((short)j, (short)6000);
//创建样式(使用工作本的对象创建)
HSSFCellStyle cellStyle = workBook.createCellStyle();
//创建字体的对象
HSSFFont font = workBook.createFont();
//将字体加粗
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
//设置字体的颜色
short color = HSSFColor.RED.index;
font.setColor(color);
//将新设置的字体属性放置到样式中
cellStyle.setFont(font);
if(fieldName.get(j) != null){
cell.setCellStyle(cellStyle);
cell.setCellValue((String) fieldName.get(j));
}else{
cell.setCellStyle(cellStyle);
cell.setCellValue("-");
}
}

for (int k = 0; k < (rows < SPLIT_COUNT ? rows : SPLIT_COUNT); k++) {
HSSFRow row = sheet.createRow((short) (k + 1));
//将数据内容放入excel单元格
ArrayList rowList = (ArrayList) fieldData.get((i - 1)* SPLIT_COUNT + k);
//ArrayList rowList = fieldData;
for (int n = 0; n < rowList.size(); n++) {
HSSFCell cell = row.createCell((short) n);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
if(rowList.get(n) != null){
cell.setCellValue((String) rowList.get(n).toString());
}else{
cell.setCellValue("");
}
}
}
}
return workBook;
}

public void expordExcel(OutputStream os) throws Exception {
workBook = createWorkbook();
workBook.write(os);
os.close();
}

}