java中使用 POI导出excel表格的简单实现
大概流程分7步:
1.创建工作簿 -->
2.创建sheet表 -->
3.创建row行(建议使用循环) -->
4.用row行逐一创建单元格(建议使用循环) -->
5.单元格内填充自己的数据并设置样式 -->
6.其他设置(合并单元格、冻结行列、设置列宽等) -->
7.输出excel文件 -->
下面开始流程:
提前准备好依赖:
<!--操作excel--> <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>
1.创建工作簿-->
//创建一个工作薄 SXSSFWorkbook workbook = new SXSSFWorkbook();
2.创建sheet表-->
//创建一个sheet SXSSFSheet sheet = (SXSSFSheet) workbook.createSheet(); //设置sheet页长度限制,-1则不限制长度 sheet.setRandomAccessWindowSize(-1);
3.创建row行-->
//创建第1行,从0开始算 Row row0 = sheet.createRow(0); //创建第2行 Row row1 = sheet.createRow(1); //创建第3行 Row row2 = sheet.createRow(2); //创建第4行 Row row3 = sheet.createRow(3); //以此类推,建议根据List内容使用循环创建
4.循环创建cell单元格-->
//在刚刚创建的第1行 “row0” 的基础上创建4个单元格并且设置内容,这里手动创建来演示 //实际中使用中应该使用循环来进行创建 Cell cell0 = row0.createCell(0); cell0.setCellValue("我是单元格的内容1"); Cell cell1 = row0.createCell(1); cell1.setCellValue("我是单元格的内容2"); Cell cell2 = row0.createCell(2); cell2.setCellValue("我是单元格的内容3"); Cell cell3 = row0.createCell(3); cell3.setCellValue("我是单元格的内容4");
5.写入自己的数据、样式、字体 等设置信息、、、
//表中要几种样式,或几种字体,提前创建好,设置单元格的时候就可以直接拿来用了
//创建样式:
CellStyle cellStyle = workbook.createCellStyle();
//水平居中 cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER); //上下居中 cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER); //设置字体 Font font1 = workbook.createFont(); font1.setFontName("黑体"); font1.setFontHeightInPoints((short) 16); //字体大小
XSSFFont font2 = wb.createFont();
font2.setFontName(“仿宋_GB2312”);
font2.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);//粗体显示
font2.setFontHeightInPoints((short) 12);
//将设置好的字体放入刚创建的样式中
cellStyle.setFont(font1);
//使用样式: 在需要设置的单元格中设置cell.setCellStyle(里面放刚创建的样式);
6.合并想合并的单元格、冻结首行等、、、
//合并单元格的方法(根据自己需要,每次合并都需要分别设置四个属性) //sheet.addMergedRegion(new CellRangeAddress(起始行号, 结束行号, 其实列号, 结束列号)); sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 3)); sheet.addMergedRegion(new CellRangeAddress(0, 0, 4, 5));
//冻结第一行
sheet.createFreezePane(0,1,0,1);
//分别设置列宽,参数1:列号 参数2:宽度值
sheet.setColumnWidth(0,3000);
sheet.setColumnWidth(1,3000);
sheet.setColumnWidth(2,3000);
sheet.setColumnWidth(3,5000);
7.用输出流输出excel文件
//输出文件
//创建文件输出流
FileOutputStream fileOutputStream = new FileOutputStream(new File("E:\\new5\\autoMation\\resource\\test.xlsx"));
//用最开始创建的工作簿.write进行文件写出 workbook.write(fileOutputStream);
下面是完整的简单流程:
准备一个实体类,方便输出:
public class People { public String name; public String sex; public String age; public String phone; public People() { } public People(String name, String sex, String age, String phone) { this.name = name; this.sex = sex; this.age = age; this.phone = phone; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } }
生成excel的代码:
public class OutExcel {
public static void main(String[] args) throws IOException, IllegalAccessException {
ArrayList<People> dataList = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
People people = new People("姓名" + i, i + "", "男", "12345678911");
dataList.add(people);
doExceloneThread(dataList);
}
}
public static void doExceloneThread(ArrayList<People> dataList) throws IllegalAccessException, IOException {
//创建一个工作薄
SXSSFWorkbook workbook = new SXSSFWorkbook();
//创建一个sheet
SXSSFSheet sheet = (SXSSFSheet) workbook.createSheet();
//设置sheet页长度限制
sheet.setRandomAccessWindowSize(-1);
//-------------------------------------------------------
//表中要几种样式,或几种字体,提前创建好,设置单元格的时候就可以直接设置了
//创建样式
CellStyle cellStyle = workbook.createCellStyle();
//水平居中
cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
//上下居中
cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
//设置边框
cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN); //下边框
cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);//左边框
cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);//上边框
cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);//右边框
//设置字体
Font font = workbook.createFont();
font.setFontName("黑体");
font.setFontHeightInPoints((short) 16); //字体大小
//将字体设置放入样式中
cellStyle.setFont(font);
//创建第一行.后面需要合并某些单元格
Row row0 = sheet.createRow(0);
Cell cell0 = row0.createCell(0);
cell0.setCellValue("哦哦哦");
cell0.setCellStyle(cellStyle);
Cell cell1 = row0.createCell(1);
cell1.setCellValue("");
cell1.setCellStyle(cellStyle);
Cell cell2 = row0.createCell(2);
cell2.setCellValue("哈哈哈");
cell2.setCellStyle(cellStyle);
Cell cell3 = row0.createCell(3);
cell3.setCellValue("哈哈哈");
cell3.setCellStyle(cellStyle);
//-------------------------------------------
//遍历集合中的数据
//也可以采用自己的方法,总之就是将数据放到一个一个的cell(单元格)中,
Iterator<People> iterator = dataList.iterator();
//反射
Field[] fields = People.class.getDeclaredFields();
Integer currentRow = 1;
CellStyle cellStyle2 = workbook.createCellStyle();
//上下左右居中
cellStyle2.setAlignment(XSSFCellStyle.ALIGN_CENTER);
cellStyle2.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
cellStyle2.setBorderBottom(XSSFCellStyle.BORDER_THIN); //下边框
cellStyle2.setBorderLeft(XSSFCellStyle.BORDER_THIN);//左边框
cellStyle2.setBorderTop(XSSFCellStyle.BORDER_THIN);//上边框
cellStyle2.setBorderRight(XSSFCellStyle.BORDER_THIN);//右边框
while (iterator.hasNext()) {
People people = iterator.next();
Row row = sheet.createRow(currentRow);
for (int i = 0; i < fields.length; i++) {
Cell cell = row.createCell(i);
if (currentRow == 1){
cell.setCellValue(fields[i].getName());
}else{
cell.setCellValue(String.valueOf(fields[i].get(people)));
}
cell.setCellStyle(cellStyle2);
}
currentRow++;
}
//合并单元格的方法
//sheet.addMergedRegion(new CellRangeAddress(起始行号, 结束行号, 其实列号, 结束列号));
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 1));
sheet.addMergedRegion(new CellRangeAddress(0, 0, 2, 3));
//冻结第一行
sheet.createFreezePane(0,1,0,1);
//设置列宽,参数1:列号 参数2:宽度值
sheet.setColumnWidth(0,3000);
sheet.setColumnWidth(1,3000);
sheet.setColumnWidth(2,3000);
sheet.setColumnWidth(3,5000);
//输出文件
FileOutputStream fileOutputStream = new FileOutputStream(new File("E:\\new5\\autoMation\\resource\\test.xlsx"));
workbook.write(fileOutputStream);
}
}