在很多项目中,都需要我们把数据库查询出来的数据导出成excel表格,导出就算了,还给我弄个模板,大标题要写在合并表格里还要居中,标题要有底色,还要加粗,等等,下面我就来讲一下我用到的表格操作:
首先要进行表格操作,要添加相关依赖
这里我重点说明一下,我用4.3及以上版本就不行,可能是方法有升级
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.1</version>
</dependency>
创建excel文件
如果想生成.xls文件:
Workbook workbook = new HSSFWorkbook();
如果想生成.xlsx文件
Workbook workbook = new XSSFWorkbook();
创建工作簿
也就是我们说的Sheet页,sheet页是根据Workbook对象生成的,也就是sheet页依赖excel文件而存在。
Sheet sheet = workbook.createSheet("Sheet1"); // Sheet1为要生成的sheet页的名称
写入操作
完成以上操作,在不考虑样式的前提下,我们就可以写数据了。写数据的话是按行进行写入的。
首先声明行变量
行是根据sheet声明的,参数为该行的位置(从0开始算)
Row titleRow = sheet.createRow(0);
写入数据
有了行对象,那么我们就可以对该行的某列进行操作了
首先要创建该行某列对象,然后用getCell方法获取单元格,参数为单元格索引位置(从0开始算),然后用setCellValue方法进行内容写入,参数为内容
titleRow.createCell(0);
titleRow.getCell(0).setCellValue("序号");
写完之后,返回workbook对象就可以了。
按这样操作,一份没有样式的表格文件就生成好了。
样式操作
首先要声明样式对象
因为创建的workbook对象方式不同,样式对象的类型也不一样,不过方法是类似的
XSSFCellStyle cellStyle = workbook.createCellStyle();
背景颜色
这里修改只需要改new java.awt.Color里的参数值即可,也支持输入0xff000000(默认值)16进制数
需要与设置填充格式一起使用才生效,使用无先后顺序
cellStyle.setFillForegroundColor(new XSSFColor(new java.awt.Color(89, 214, 255),new DefaultIndexedColorMap()));
字体居中
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 垂直居中
cellStyle.setAlignment(HorizontalAlignment.CENTER); // 水平居中
设置边框
BorderStyle.THIN为宽度属性
cellStyle.setBorderBottom(BorderStyle.THIN); // 下边框
cellStyle.setBorderRight(BorderStyle.THIN); // 右边框
cellStyle.setBorderLeft(BorderStyle.THIN); // 左边框
cellStyle.setBorderTop(BorderStyle.THIN); // 上边框
设置填充格式
cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
自动换行
cellStyle.setWrapText(true);
字体设置
Font titleFont = workbook.createFont(); // 声明字体对象
titleFont.setBold(true); // 字体加粗
titleFont.setFontName("华文彩云"); // 字体类型
titleFont.setFontHeightInPoints((short) 20); // 字体大小
cellStyle.setFont(titleFont); // 赋值样式对象
设置列宽
sheet.setColumnWidth(0, 4200); // 第0列列宽设置为4200
合并单元格
sheet.addMergedRegion(new CellRangeAddress(1, 3, 1, 3)); // 参数分别为起始行,结束行,起始列,结束列
返回前端的话,写法是这样的,方法是没有返回的,也就是void
public void index(HttpServletResponse response) {
XSSFWorkbook workbook = service.test();
if (workbook!=null){
String fileName = "1.xlsx";
try {
fileName = URLEncoder.encode(fileName, "UTF-8");
//设置ContentType请求信息格式
response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName);
OutputStream outputStream = response.getOutputStream();
workbook.write(outputStream);
outputStream.flush();
outputStream.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
我这边用到的基本是这些,如果有其他的操作可以评论我或者私信我,我这边在做补充