版权声明:Wizard原创博客,多多支持 https://blog.csdn.net/ysj4428/article/details/82183210
对于常用的管理系统,导出Excel是很常见的功能。
导出表格需要根据当前查询数据进行导出,那么现在就开始干。我这里使用的springMVC。
第一步:Web端页面添加导出按钮
<form action="exportIllegalDevice" method="post" id="illegalDevice">
<input type="submit" name="export" class="btn btn-primary" id="exportButton" value="导出"/>
</form>
第二步:编写控制层接收请求
这里需要注意的是导出表格使用封装好的POI,所以在Maven项目中添加依赖:
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.9</version>
</dependency>
继续写代码:
@RequestMapping("exportIllegalDevice")
@ResponseBody
public void exportList(HttpServletRequest request, HttpServletResponse response)throws Exception{
String fileName = "设备列表";
response.reset();
response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename="+ new String((fileName + ".xls").getBytes(),"iso-8859-1"));
HSSFWorkbook wb = new HSSFWorkbook();
ServletOutputStream out=response.getOutputStream();
wb.write(out);
out.flush();
out.close();
}
先不论别的,此时在浏览器就已经可以下载一个空文件了。
这是需要我们做的就是装填数据啦!
第三步:根据业务装填数据
刚才在控制层我们只需要将
HSSFWorkbook wb = new HSSFWorkbook();
这句代码中HSSFWorkbook的对象从业务层中获取,而不是简单的new一个空对象。
业务层中装填代码为:
public HSSFWorkbook getExcelWorkBook() {
//获取导出列表数据
List<IllegalDevice> illegalDeviceList = illegalDeviceMapper.findByParam(new IllegalDevice());
HSSFWorkbook hssf = ExcelUtil.exportIllgalDevice(illegalDeviceList);
return hssf;
}
illegalDeviceList对象是你要从数据库中导出的数据List集合
hssf对象则是生成的表格对象,看一下具体实现:
public static HSSFWorkbook exportIllgalDevice(List<IllegalDevice> list){
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("IllegalDevice");
HSSFRow row;
HSSFCell cell;
//全局样式(可以影响所有的样式,就是在定义sheet的时候添加的默认样式)
sheet.setDefaultColumnWidth(18);//设置单元格默认宽度为17
sheet.setDefaultRowHeight((short)300);//设置行高度默认300
//sheet.setColumnWidth(2, 22 * 512); //设置列宽,20个字符宽
HSSFCellStyle style = wb.createCellStyle();
style.setWrapText(true);//设置自动换行
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//字体水平居中
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//字体垂直居中
//设置字体样式(需要用style.setFont(font);装填进去),如果标题等想用不同样式,新建font对象,然后在下面判断添加不同样式
HSSFFont font = wb.createFont();
//font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//字体加粗
font.setFontHeightInPoints((short)12);//设置字号
font.setFontName("Times New Roman");//设置字体类型Times New Roman
style.setFont(font);
//将List集合数据装填到二维数组中
String[][] datas = dataFilling(list);
//进行表格行和单元格创建
for (int i = 0; i < datas.length; i++) {
row = sheet.createRow(i);// 创建表格行(都是从0开始代表第一行)
if(i==0){//设置第一行行高
row.setHeight((short)700);
}
for (int j = 0; j < datas[i].length; j++) {//在该行创建单元格
cell = row.createCell(j);// 根据表格行创建单元格
cell.setCellValue(String.valueOf(datas[i][j]));
cell.setCellStyle(style);
}
}
return wb;
}
没错里面将Excel创建行以及单元格以及部分表格样式都进行了相关设置,而填充数据使用了二维数组。
这里的datas二维数组填充数据方法如下:
public static String[][] dataFilling(List<IllegalDevice> list){
String[] firstTileArr = IllegalDeviceExcelTitle.titleArray();
String[][] dataTwoArray = new String[list.size()+1][firstTileArr.length];
//先装填第一行题头
for (int i = 0; i < firstTileArr.length; i++) {
dataTwoArray[0][i] = firstTileArr[i];
}
//装填剩余部分
for (int i = 0; i < list.size(); i++) {
IllegalDevice ill = list.get(i);
dataTwoArray[i+1][0] = String.valueOf(i+1);
dataTwoArray[i+1][1] = ill.getId_Ip();
dataTwoArray[i+1][2] = ill.getId_Type();
dataTwoArray[i+1][3] = ill.getId_Mac();
dataTwoArray[i+1][4] = ill.getId_DeviceType();
dataTwoArray[i+1][5] = ill.getId_HostName();
dataTwoArray[i+1][6] = ill.getId_Date().toString();
dataTwoArray[i+1][7] = ill.getId_Remark();
dataTwoArray[i+1][8] = ill.getId_DeviceSystem();
dataTwoArray[i+1][9] = ill.getId_Description();
dataTwoArray[i+1][10] = ill.getId_PnpDeviceId();
dataTwoArray[i+1][11] = ill.getId_Vendorid();
dataTwoArray[i+1][12] = ill.getId_Productid();
dataTwoArray[i+1][13] = ill.getId_ClassGuid();
}
return dataTwoArray;
}
二维数组第一个维度代表第几行,第二个维度代表列。例如datas[2][3]:代表了第三行第四列的那个单元格。
总结:
Web项目中导出excel作为常用功能,实现的主要思想是前端使用请求,后端将文件作为流传输到前端。有时因为一些前端框架可能会导致导出的信息直接展示在页面。而不是导出文件,因此遇到问题还需要实际解决。同时文件名称乱码问题也是需要注意。最好使用英文名,奈何有时必须中文,测试一下除了window10自带的那个浏览器使用这套代码乱码,其他浏览器没问题。懒得调试,如果有人有能够解决该问题更好的方法,留言告知不胜感激!!!