使用POI读取/创建Execl(.xlsx)文件
最近项目中用到了解析Execl表格的功能,在网上百度了一下自己写了一个小Demo。由于项目中使用的是Execl2007,就是后缀为.xlsx的,所以只研究了解析和创建Execl2007的文件,解析Execl2007和Execl2003有一定的区别,大家在解析的时候要注意。
一下是Demo中用到的jar包(可能有几个包用不到,懒得删了):
其他的我就不过多的介绍了,每个方法的具体用法可以参考官方手册,直接上代码:
poi文档和jar包下载地址:http://poi.apache.org/download.html
1 package com.lym.test; 2 3 import java.io.FileInputStream; 4 import java.io.FileOutputStream; 5 import java.io.InputStream; 6 import java.io.OutputStream; 7 8 import org.apache.poi.hssf.util.HSSFColor; 9 import org.apache.poi.ss.usermodel.Cell; 10 import org.apache.poi.ss.usermodel.CellStyle; 11 import org.apache.poi.ss.usermodel.Font; 12 import org.apache.poi.ss.usermodel.Row; 13 import org.apache.poi.ss.usermodel.Workbook; 14 import org.apache.poi.xssf.usermodel.XSSFSheet; 15 import org.apache.poi.xssf.usermodel.XSSFWorkbook; 16 17 /** 18 * 使用POI读取/创建Execl(2007版.xlsx)文件 19 * 20 * @author 刘彦民 21 * 22 */ 23 public class POIReaderExecl { 24 25 public static void main(String[] args) throws Exception { 26 27 readExeclFile(); 28 // createExeclFile(); 29 } 30 31 /** 32 * 创建Execl文件 33 * 34 * @throws Exception 35 */ 36 public static void createExeclFile() throws Exception { 37 // 创建工作空间 38 XSSFWorkbook wb = new XSSFWorkbook(); 39 // 创建工作表 40 XSSFSheet sheet = wb.createSheet("testdata"); 41 // 创建标题行(第一行) 42 Row row0 = sheet.createRow(0); 43 // 创建列 44 for (int i = 0; i < 11; i++) { 45 Cell cell_1 = row0.createCell(i, Cell.CELL_TYPE_STRING);// 第一个参数:列数(从0开始),第二个参数:列类型 46 // 设置单元格样式 47 CellStyle style = getStyle(wb); 48 cell_1.setCellStyle(style); 49 cell_1.setCellValue("Hello Column" + i); 50 // 设置自动调整大小 51 sheet.autoSizeColumn(i); 52 } 53 for (int rowNum = 1; rowNum < 200; rowNum++) { 54 Row row = sheet.createRow(rowNum); 55 for (int i = 0; i < 11; i++) { 56 Cell cell = row.createCell(i, Cell.CELL_TYPE_STRING); 57 cell.setCellValue("cell(" + String.valueOf(rowNum + 1) +", "+ String.valueOf(i + 1) + ")"); 58 } 59 } 60 OutputStream out = new FileOutputStream("D://data.xlsx"); 61 wb.write(out); 62 out.flush(); 63 out.close(); 64 } 65 66 /** 67 * 读取Execl文件 68 * 69 * @throws Exception 70 */ 71 public static void readExeclFile() throws Exception { 72 // 创建输入流 73 InputStream in = new FileInputStream("D://order.xlsx"); 74 // 创建工作空间 75 XSSFWorkbook wb = new XSSFWorkbook(in); 76 // 获取工作表 77 XSSFSheet sheet = wb.getSheetAt(0);// 获取第一个工作表 78 // 获取总行数 79 int rowNums = sheet.getLastRowNum(); 80 // 获取总列数 81 int colNums = sheet.getPhysicalNumberOfRows(); 82 // 工作行 83 Row row = null; 84 // 工作单元格 85 Cell cell = null; 86 87 System.out.println("总行数:" + rowNums); 88 System.out.println("总列数:" + colNums); 89 // 循环遍历每行的内容 90 for (int i = 1; i <= rowNums; i++) { 91 // 获取第i行的工作行,第0行是列头,所以从第1行开始 92 row = sheet.getRow(i); 93 // 获取每个单元格的值 94 for (int j = 0; j < colNums; j++) { 95 cell = row.getCell(j); 96 cell.setCellType(Cell.CELL_TYPE_STRING); 97 System.out.print(cell.toString() + " "); 98 } 99 System.out.println(); 100 } 101 } 102 103 /** 104 * 设置单元格样式 105 */ 106 public static CellStyle getStyle(Workbook workbook) { 107 108 CellStyle style = workbook.createCellStyle(); 109 style.setAlignment(CellStyle.ALIGN_CENTER); 110 style.setVerticalAlignment(CellStyle.VERTICAL_CENTER); 111 // 设置单元格字体 112 Font headerFont = workbook.createFont(); // 字体 113 headerFont.setFontHeightInPoints((short) 14); 114 headerFont.setColor(HSSFColor.RED.index); 115 headerFont.setFontName("宋体"); 116 style.setFont(headerFont); 117 style.setWrapText(true); 118 119 // 设置单元格边框及颜色 120 style.setBorderBottom((short) 1); 121 style.setBorderLeft((short) 1); 122 style.setBorderRight((short) 1); 123 style.setBorderTop((short) 1); 124 style.setWrapText(true); 125 return style; 126 } 127 128 }
读取order.xlsx文件的内容:
生成data.xlsx文件的内容: