• Java POI读取Excel数据,将数据写入到Excel表格


    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)  设置背景颜色:

    1. cellStyle.setFillForegroundColor((short) 13);// 设置背景色    
    2. cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);  

    (4)设置边框:

    1. cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框    
    2. cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框    
    3. cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框    
    4. cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框    

    (5)设置居中:cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中   

    (6)设置字体:

    1. HSSFFont font2 = wb.createFont();    
    2. font2.setFontName("仿宋_GB2312");    
    3. font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//粗体显示    
    4. font2.setFontHeightInPoints((short) 12);  //字体大小  
    5. cellStyle.setFont(font);//选择需要用到的字体格式 

    (7)设置列宽

    1. sheet.setColumnWidth(0, 3766);   
    2. //第一个参数代表列id(从0开始),第2个参数代表宽度值  参考 :"2012-08-10"的宽度为2500 

    (8)设置自动换行

    1. cellStyle.setWrapText(true);//设置自动换行   

    (9)合并单元格

    1. //参数1:行号 参数2:起始列号 参数3:行号 参数4:终止列号    
    2. Region region1 = new Region(0, (short) 0, 0, (short) 6);//合并第(0,0)单元格到第(0,6)单元格  
    3. sheet.addMergedRegion(region1);  
    4. //此方法在POI3.8中已经被废弃,建议使用下面一个   
    5. //或者用  
    6. CellRangeAddress region1 = new CellRangeAddress(rowNumber, rowNumber, (short) 0, (short) 11); //参数1:起始行 参数2:终止行 参数3:起始列 参数4:终止列   
    7. sheet.addMergedRegion(region1);  
    8. //但应注意两个构造方法的参数不是一样的,具体使用哪个取决于POI的不同版本。

                                                                                                                                                                          

  • 相关阅读:
    Nginx/Apache图片缩略图技术
    MySQL 备份和恢复
    MySQL主从复制
    xcode针对不同IOS版本的代码编译问题
    java 5 ReadWriteLock
    java 5 Lock
    结对-及格程序查询系统-结对项目总结
    团队-象棋游戏-开发文档
    结对-及格程序查询-最终程序
    结对-及格程序查询-测试过程
  • 原文地址:https://www.cnblogs.com/dz-boss/p/6734623.html
Copyright © 2020-2023  润新知