目录
6.推荐链接
1.什么是POI
Apache POI是Apache软件基金会的开放源码程序库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
2.Excel版本区别
用JavaPOI导出Excel时,我们会考虑到Excel版本及数据量的问题。针对不同的Excel版本,要采用不同的工具类。
HSSFWorkbook
是操作Excel2003以前(包括2003)的版本,扩展名是.xls;
XSSFWorkbook
是操作Excel2007的版本,扩展名是.xlsx;对于不同版本的EXCEL文档要使用不同的工具类,如果使用错了,会提示如下错误信息。
3.类介绍
XSSFWorkbook
读写Microsoft Excel表格的类
方法
Sheet
表示工作表
XSSFRow
表示行
XSSFCell
表示单元格
4.使用
POI支持Maven和jar方式导入,如下
Maven坐标
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.1</version>
</dependency>Jar包方式
4.1 创建Excel表格
4.1.1 简单使用
@Test public void write1() throws IOException { // 创建工作簿 XSSFWorkbook workbook = new XSSFWorkbook(); // 新建工作表 XSSFSheet sheet = workbook.createSheet("user"); // 文件名是时间格式 SimpleDateFormat format = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss"); String date = format.format(new Date()); String fileName = date + ".xlsx"; FileOutputStream fos = new FileOutputStream(new File(fileName)); // 输出文件 workbook.write(fos); workbook.close(); fos.close(); }
4.1.2 创建合并单元格的列
@Test public void write2() throws Exception { // 创建工作簿 XSSFWorkbook workbook = new XSSFWorkbook(); // 新建工作表 XSSFSheet sheet = workbook.createSheet("user"); //自动列大小 sheet.autoSizeColumn(1, true); //创建行,0表示第一行 XSSFRow row = sheet.createRow(0); //合并单元格 参数说明:1:开始行 2:结束行 3:开始列 4:结束列 sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 8)); //获取列【标题列】 XSSFCell title = row.createCell(0); //创建列的样式 XSSFCellStyle titleStyle = workbook.createCellStyle(); //垂直和水平居中 titleStyle.setAlignment(HorizontalAlignment.CENTER); titleStyle.setVerticalAlignment(VerticalAlignment.CENTER); //设置文本 title.setCellValue("user信息表"); //背景颜色 titleStyle.setFillForegroundColor(IndexedColors.BLUE.getIndex()); titleStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); //设置样式 title.setCellStyle(titleStyle); //设置行高度 row.setHeight((short) 800); // 文件名是时间格式 SimpleDateFormat format = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss"); String date = format.format(new Date()); String fileName = date + ".xlsx"; FileOutputStream fos = new FileOutputStream(new File(fileName)); // 输出文件 workbook.write(fos); workbook.close(); fos.close(); }
运行结果:
4.1.3 带标题的表格
@Test public void write3() throws Exception { //表头 String[] titles = new String[]{"id","username","password","email"}; // 创建工作簿 XSSFWorkbook workbook = new XSSFWorkbook(); // 新建工作表 XSSFSheet sheet = workbook.createSheet("user"); //自动列大小 sheet.autoSizeColumn(1,true); //创建行,0表示第一行 XSSFRow row = sheet.createRow(0); //合并单元格 参数说明:1:开始行 2:结束行 3:开始列 4:结束列 sheet.addMergedRegion(new CellRangeAddress(0,0,0,3)); //获取列【标题列】 XSSFCell title = row.createCell(0); //创建列的样式 XSSFCellStyle titleStyle = workbook.createCellStyle(); //垂直和水平居中 titleStyle.setAlignment(HorizontalAlignment.CENTER); titleStyle.setVerticalAlignment(VerticalAlignment.CENTER); //设置文本 title.setCellValue("user"); //背景颜色 titleStyle.setFillForegroundColor(IndexedColors.BLUE_GREY.getIndex()); titleStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); //设置样式 title.setCellStyle(titleStyle); //设置行高度 row.setHeight((short) 800); //创建一行,第2行 row = sheet.createRow(1); for (int i = 0; i < titles.length; i++) { XSSFCell cell = row.createCell(i); // if (i == 0) { // //设置第一列宽度 // sheet.setColumnWidth(i, 800*10); // } cell.setCellValue(titles[i]); } // 文件名是时间格式 SimpleDateFormat format = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss"); String date = format.format(new Date()); String fileName = date + ".xlsx"; FileOutputStream fos = new FileOutputStream(new File(fileName)); // 输出文件 workbook.write(fos); workbook.close(); fos.close(); }
运行结果:
4.1.4 填充数据
运行结果:
4.2 读取数据
读取template.xlsx的数据
import com.monitorjbl.xlsx.StreamingReader; 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; import org.junit.Test; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Demo { @Test public void reader() throws IOException { Scanner sc = new Scanner(System.in); String path = "template.xlsx"; //读取Excel表格 File file = new File(path); FileInputStream fis = new FileInputStream(file); Workbook wk = StreamingReader.builder() //缓冲到内存中的行数 .rowCacheSize(10000) //内存大小 .bufferSize(4096 * 2).open(fis); // 获取工作表 Sheet sheet = wk.getSheetAt(0); //合法表头 String[] titles = {"name", "author", "price"}; //存储多行(所有)数据 List<List<String>> list = new ArrayList<>(); //遍历行 for (Row row : sheet) { //存储一行数据 List<String> rowList = new ArrayList<>(); //遍历列 for (Cell cell : row) { rowList.add(cell.getStringCellValue()); } list.add(rowList); } //遍历数据 for (List<String> strings : list) { System.out.println(strings); } } }
运行结果:
5.其它介绍
设置背景颜色
titleStyle.setFillForegroundColor((short) 13);// 设置背景色
titleStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);设置字体
XSSFFont font = workbook.createFont();
font.setFontName("仿宋_GB2312");
font.setFontHeightInPoints((short) 50);
titleStyle.setFont(font);6.推荐链接
POI核心类