1.准备
首先需要导入poi相应的jar包,包括:
下载地址:http://pan.baidu.com/s/1bpoxdz5
所需要的包的所在位置包括:
2.读取Excel数据代码
1 package Shape2MDB; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.InputStream; 6 import java.util.ArrayList; 7 import java.util.List; 8 9 import org.apache.poi.hssf.usermodel.HSSFCell; 10 import org.apache.poi.hssf.usermodel.HSSFRow; 11 import org.apache.poi.hssf.usermodel.HSSFSheet; 12 import org.apache.poi.hssf.usermodel.HSSFWorkbook; 13 import org.apache.poi.xssf.usermodel.XSSFCell; 14 import org.apache.poi.xssf.usermodel.XSSFRow; 15 import org.apache.poi.xssf.usermodel.XSSFSheet; 16 import org.apache.poi.xssf.usermodel.XSSFWorkbook; 17 18 import Bean.Student; 19 20 public class ReadXMLXData { 21 public static void main(String[] args) { 22 String path = "D:\1work\XLSX\Test.xlsx"; 23 if (path.endsWith(".xls")) { 24 readExcel2003(path); 25 } else if (path.endsWith(".xlsx")) { 26 readExcel2007(path); 27 } 28 } 29 30 private static void readExcel2007(String path) { 31 File excelFile = null;// Excel文件对象 32 InputStream is = null;// 输入流对象 33 String cellStr = null;// 单元格,最终按字符串处理 34 List<Student> studentList = new ArrayList<Student>();// 返回封装数据的List 35 Student student = null;// 每一个学生信息对象 36 try { 37 excelFile = new File(path); 38 is = new FileInputStream(excelFile);// 获取文件输入流 39 XSSFWorkbook workbook2007 = new XSSFWorkbook(is);// 创建Excel2007文件对象 40 XSSFSheet sheet = workbook2007.getSheetAt(0);// 取出第一个工作表,索引为0 41 // 这里注意区分getLastRowNum()和getPhysicalNumberOfRows()的区别 42 System.out.println("sheet.getLastRowNum():" + sheet.getLastRowNum()); 43 System.out.println("sheet.getPhysicalNumberOfRows():" + sheet.getPhysicalNumberOfRows()); 44 // 开始循环遍历行,表头不处理,从1开始 45 for (int i = 1; i <= sheet.getLastRowNum(); i++) { 46 student = new Student();// 实例化Student对象 47 XSSFRow row = sheet.getRow(i);// 获取行对象 48 if (row == null) {// 如果为空,不处理 49 continue; 50 } 51 // row如果不为空,循环遍历单元格 52 for (int j = 0; j < row.getLastCellNum(); j++) { 53 XSSFCell cell = row.getCell(j);// 获取单元格对象 54 if (cell == null) {// 单元格为空设置cellStr为空串 55 cellStr = ""; 56 } else if (cell.getCellType() == XSSFCell.CELL_TYPE_BOOLEAN) {// 对布尔值的处理 57 cellStr = String.valueOf(cell.getBooleanCellValue()); 58 } else if (cell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC) {// 对数字值的处理 59 cellStr = cell.getNumericCellValue() + ""; 60 } else {// 其余按照字符串处理 61 cellStr = cell.getStringCellValue(); 62 } 63 64 // 下面按照数据出现位置封装到bean中 65 if (j == 0) { 66 student.setName(cellStr); 67 } else if (j == 1) { 68 student.setGender(cellStr); 69 } else if (j == 2) { 70 student.setAge(new Double(cellStr).intValue()); 71 } else if (j == 3) { 72 student.setSclass(cellStr); 73 } else { 74 student.setScore(new Double(cellStr).intValue()); 75 } 76 } 77 studentList.add(student);// 数据装入List 78 } 79 System.out.println(studentList); 80 81 } catch (Exception e) { 82 e.printStackTrace(); 83 } finally {// 关闭文件流 84 try { 85 if (is != null) { 86 is.close(); 87 } 88 } catch (Exception e2) { 89 e2.printStackTrace(); 90 } 91 } 92 } 93 94 private static void readExcel2003(String path) { 95 File excelFile = null;// Excel文件对象 96 InputStream is = null;// 输入流对象 97 String cellStr = null;// 单元格,最终按字符串处理 98 List<Student> studentList = new ArrayList<Student>();// 返回封装数据的List 99 Student student = null;// 每个学生信息对象 100 try { 101 excelFile = new File(path); 102 is = new FileInputStream(excelFile);// 获取文件输入流 103 HSSFWorkbook workbook2003 = new HSSFWorkbook(is);// 创建Excel2003文件对象 104 HSSFSheet sheet = workbook2003.getSheetAt(0);// 取出第一个工作表,索引是0 105 // 这里注意区分getLastRowNum()和getPhysicalNumberOfRows()的区别 106 System.out.println("sheet.getLastRowNum():" + sheet.getLastRowNum()); 107 System.out.println("sheet.getPhysicalNumberOfRows():" + sheet.getPhysicalNumberOfRows()); 108 // 开始循环遍历行,表头不处理,从1开始 109 for (int i = 1; i <= sheet.getLastRowNum(); i++) { 110 student = new Student();// 实例化Student对象 111 HSSFRow row = sheet.getRow(i);// 获取行对象 112 if (row == null) {// 如果为空,不处理 113 continue; 114 } 115 // 如果row不为空,循环遍历单元格 116 System.out.println("row.getLastCellNum:" + row.getLastCellNum()); 117 for (int j = 0; j < row.getLastCellNum(); j++) { 118 HSSFCell cell = row.getCell(j);// 获取单元格对象 119 if (cell == null) {// 如果为空,设置cellStr为空串 120 cellStr = ""; 121 } else if (cell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN) {// 对布尔值的处理 122 cellStr = String.valueOf(cell.getBooleanCellValue()); 123 } else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {// 对数字值的处理 124 cellStr = cell.getNumericCellValue() + ""; 125 } else {// 其余按照字符串处理 126 cellStr = cell.getStringCellValue(); 127 } 128 129 // 下面按照数据出现的位置封装到bena中 130 if (j == 0) { 131 student.setName(cellStr); 132 } else if (j == 1) { 133 student.setGender(cellStr); 134 } else if (j == 2) { 135 student.setAge(new Double(cellStr).intValue()); 136 } else if (j == 3) { 137 student.setSclass(cellStr); 138 } else { 139 student.setScore(new Double(cellStr).intValue()); 140 } 141 } 142 studentList.add(student);// 数据装入List 143 } 144 System.out.println(studentList); 145 } catch (Exception e) { 146 e.printStackTrace(); 147 } finally {// 关闭文件流 148 if (is != null) { 149 try { 150 is.close(); 151 } catch (Exception e2) { 152 e2.printStackTrace(); 153 } 154 } 155 } 156 } 157 }
3.将数据写入到Excel表格代码
1 package Shape2MDB; 2 3 import java.io.FileOutputStream; 4 import java.text.SimpleDateFormat; 5 import java.util.ArrayList; 6 import java.util.List; 7 8 import org.apache.poi.hssf.usermodel.HSSFCell; 9 import org.apache.poi.hssf.usermodel.HSSFCellStyle; 10 import org.apache.poi.hssf.usermodel.HSSFRow; 11 import org.apache.poi.hssf.usermodel.HSSFSheet; 12 import org.apache.poi.hssf.usermodel.HSSFWorkbook; 13 14 import Bean.Student; 15 16 public class OutputXMLSData { 17 public static void main(String[] args) { 18 //测试数据 19 List<Student> list = new ArrayList<Student>(); 20 Student s1 = new Student("1", "1", 1, "1", 1); 21 list.add(s1); 22 Student s2 = new Student("1", "1", 1, "1", 1); 23 list.add(s2); 24 Student s3 = new Student("1", "1", 1, "1", 1); 25 list.add(s3); 26 Student s4 = new Student("1", "1", 1, "1", 1); 27 list.add(s4); 28 Student s5 = new Student("1", "1", 1, "1", 1); 29 list.add(s5); 30 Student s6 = new Student("1", "1", 1, "1", 1); 31 list.add(s6); 32 outPutData(list); 33 } 34 35 private static void outPutData(List<Student> list) { 36 // 第一步,创建一个webbook,对应一个Excel文件 37 HSSFWorkbook wb = new HSSFWorkbook(); 38 // 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet 39 HSSFSheet sheet = wb.createSheet("学生表一"); 40 // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short 41 HSSFRow row = sheet.createRow((int) 0); 42 // 第四步,创建单元格,并设置值表头 设置表头居中 43 HSSFCellStyle style = wb.createCellStyle(); 44 style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式 45 46 HSSFCell cell = row.createCell((short) 0); 47 cell.setCellValue("name"); 48 cell.setCellStyle(style); 49 cell = row.createCell((short) 1); 50 cell.setCellValue("gerder"); 51 cell.setCellStyle(style); 52 cell = row.createCell((short) 2); 53 cell.setCellValue("age"); 54 cell.setCellStyle(style); 55 cell = row.createCell((short) 3); 56 cell.setCellValue("class"); 57 cell.setCellStyle(style); 58 cell = row.createCell((short) 4); 59 cell.setCellValue("score"); 60 cell.setCellStyle(style); 61 62 // 第五步,写入实体数据 实际应用中这些数据从数据库得到, 63 64 for (int i = 0; i < list.size(); i++) { 65 row = sheet.createRow((int) i + 1); 66 Student stu = (Student) list.get(i); 67 // 第四步,创建单元格,并设置值 68 row.createCell((short) 0).setCellValue(stu.getName()); 69 row.createCell((short) 1).setCellValue(stu.getGender()); 70 row.createCell((short) 2).setCellValue((double) stu.getAge()); 71 row.createCell((short) 3).setCellValue(stu.getSclass()); 72 row.createCell((short) 2).setCellValue((double) stu.getScore()); 73 } 74 // 第六步,将文件存到指定位置 75 try { 76 FileOutputStream fout = new FileOutputStream("C:/students.xls"); 77 wb.write(fout); 78 fout.close(); 79 } catch (Exception e) { 80 e.printStackTrace(); 81 } 82 83 } 84 }
4.异常处理
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/xmlbeans/XmlException
at Shape2MDB.ReadXMLXData.readExcel2007(ReadXMLXData.java:39)
at Shape2MDB.ReadXMLXData.main(ReadXMLXData.java:26)
Caused by: java.lang.ClassNotFoundException: org.apache.xmlbeans.XmlException
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 2 more
使用POI操作Excel,电脑上面装的office2007,一直报如下错误,第一个是反射有关的,第二个是没找到对应的类,确实在POI的几个包中也没有找到该类,但是我直接引入该类编译器又没报错……最后发现把Excel另存为2003的格式是就正确了。到网上查了下,在操作office2007还要加入一个包
xbean.jar 官网:http://xmlbeans.apache.org
本文也提供网盘下载地址:http://pan.baidu.com/s/1bQI3jK
4.POI报表的一些常用函数
摘自:http://blog.csdn.net/tolcf/article/details/48346697
(1)建立sheet:
1.HSSFSheet sheet = workbook.createSheet("sheet1");//新建sheet页
(2)兴建单元格:
2.HSSFCellStyle cellStyle = wb.createCellStyle(); //新建单元格样式
(3) 设置背景颜色:
- cellStyle.setFillForegroundColor((short) 13);// 设置背景色
- cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
(4)设置边框:
- cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
- cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
- cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
- cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
(5)设置居中:cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中
(6)设置字体:
- HSSFFont font2 = wb.createFont();
- font2.setFontName("仿宋_GB2312");
- font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//粗体显示
- font2.setFontHeightInPoints((short) 12); //字体大小
- cellStyle.setFont(font);//选择需要用到的字体格式
(7)设置列宽
- sheet.setColumnWidth(0, 3766);
- //第一个参数代表列id(从0开始),第2个参数代表宽度值 参考 :"2012-08-10"的宽度为2500
(8)设置自动换行
- cellStyle.setWrapText(true);//设置自动换行
(9)合并单元格
- //参数1:行号 参数2:起始列号 参数3:行号 参数4:终止列号
- Region region1 = new Region(0, (short) 0, 0, (short) 6);//合并第(0,0)单元格到第(0,6)单元格
- sheet.addMergedRegion(region1);
- //此方法在POI3.8中已经被废弃,建议使用下面一个
- //或者用
- CellRangeAddress region1 = new CellRangeAddress(rowNumber, rowNumber, (short) 0, (short) 11); //参数1:起始行 参数2:终止行 参数3:起始列 参数4:终止列
- sheet.addMergedRegion(region1);
- //但应注意两个构造方法的参数不是一样的,具体使用哪个取决于POI的不同版本。