文档章节

使用POI导入导出Excel2003、2007示例

IceRainYWC
 IceRainYWC
发布于 2014/05/23 11:31
字数 1827
阅读 19934
收藏 14

首先说一下所使用的POI版本3.8,需要用的的Jar包:

dom4j-1.6.1.jar
poi-3.8-20120326.jar
poi-ooxml-3.8-20120326.jar
poi-ooxml-schemas-3.8-20120326.jar
poi-scratchpad-3.8-20120326.jar
xmlbeans-2.3.0.jar

代码示例:

package com.project.excel.poi;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PushbackInputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.poi.POIXMLDocument;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
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.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ExcelUtil {
 public static void main(String[] args){
  String path2003 = "";//Excel2003文件路径
  String path2007 = "";//Excel2007文件路径
  path2003 = System.getProperties().getProperty("user.dir")+File.separator+"Excel"+File.separator+"user_2003.xls";
  path2007 = System.getProperties().getProperty("user.dir")+File.separator+"Excel"+File.separator+"user_2007.xlsx";
  
  long start2003 = System.currentTimeMillis();
  System.out.println("Excel文件路径:"+path2003);
  List<User> list2003 = parseExcel(path2003);
  System.out.println("解析2003输出总人数:"+list2003.size());
  long end2003 = System.currentTimeMillis();
  System.out.println("解析Excel2003完毕!共用时"+(end2003-start2003)+"毫秒!");
  
  long start2007 = System.currentTimeMillis();
  System.out.println("Excel文件路径:"+path2007);
  List<User> list2007 = parseExcel(path2007);
  System.out.println("解析2007输出总人数:"+list2007.size());
  long end2007 = System.currentTimeMillis();
  System.out.println("解析Excel完毕!共用时"+(end2007-start2007)+"毫秒!");
  
  System.out.println("》》》》》》》》》》开始执行Excel文件导出:");
  buildXSLExcel();//导出Excel 2003
  buildXSLXExcel();//导出Excel 2007
 }
 
 /**
  * 根据路径加载解析Excel
  * @param path
  * @return
  */
 public static List<User> parseExcel(String path){
  List<User> list = new ArrayList<User>();
        File file = null;
  InputStream input = null;
  Workbook workBook = null;
  Sheet sheet = null;
  if(path!=null&&path.length()>7){
   //判断文件是否是Excel(2003、2007)
   String suffix = path.substring(path.lastIndexOf("."),path.length());
   if (".xls".equals(suffix) || ".xlsx".equals(suffix)) {// 2003后缀或2007后缀
    file = new File(path);
    try {
     input = new FileInputStream(file);
    } catch (FileNotFoundException e) {
     System.out.println("未找到指定的文件!");
     e.printStackTrace();
    } catch (Exception e) {
     System.out.println("读取Excel文件发生异常!");
     e.printStackTrace();
    }
    if(!input.markSupported()){
     input = new PushbackInputStream(input,8);
    }
    try{
     if(POIFSFileSystem.hasPOIFSHeader(input) || POIXMLDocument.hasOOXMLHeader(input)){
      workBook = WorkbookFactory.create(input);
     }else{
      System.out.println("非法的输入流:当前输入流非OLE2流或OOXML流!");
     }
    } catch(IOException e){
     System.out.println("创建表格工作簿对象发生IO异常!原因:"+e.getMessage());
     e.printStackTrace();
    } catch(InvalidFormatException e){
     //Your InputStream was neither an OLE2 stream, nor an OOXML stream.
     System.out.println("非法的输入流:当前输入流非OLE2流或OOXML流!");
     e.printStackTrace();
    }
    try{
     if(workBook!=null){
      int numberSheet = workBook.getNumberOfSheets();
      if(numberSheet>0){
       sheet = workBook.getSheetAt(0);//获取第一个工作簿(Sheet)的内容【注意根据实际需要进行修改】
       list = getExcelContent(sheet);
      }else{
       System.out.println("目标表格工作簿(Sheet)数目为0!");
      }
     }
     input.close();
    }catch(IOException e){
     System.out.println("关闭输入流异常!"+e.getMessage());
     e.printStackTrace();
    }
   }else{
    System.out.println("非法的Excel文件后缀!");
   }
  }else{
   System.out.println("非法的文件路径!");
  }
  return list;
 }
 
 /**
  * 解析(读取)Excel内容
  * @param sheet
  * @return
  */
 @SuppressWarnings("static-access")
 public static List<User> getExcelContent(Sheet sheet){
  List<User> list = new ArrayList<User>();
  int rowCount = sheet.getPhysicalNumberOfRows();//总行数
  if(rowCount>1){
   Row titleRow = sheet.getRow(0);//标题行
   for(int i=1;i<rowCount;i++){//遍历行,略过标题行,从第二行开始
    Row row = sheet.getRow(i);
    User entity = new User();
    for(int j=0;j<3;j++){
     Cell cell = row.getCell(j);
     if(titleRow.getCell(j).getStringCellValue().indexOf("姓名")>=0){
      if(cell!=null && cell.getCellType()==cell.CELL_TYPE_STRING){
       entity.setName(cell.getStringCellValue().trim());
      }
     }
     if(titleRow.getCell(j).getStringCellValue().indexOf("性别")>=0){
      if(cell!=null && cell.getCellType()==cell.CELL_TYPE_STRING){
       entity.setSex(cell.getStringCellValue().trim());
      }
     }
     if(titleRow.getCell(j).getStringCellValue().indexOf("年龄")>=0){
      if(cell!=null && cell.getCellType()==cell.CELL_TYPE_NUMERIC){
       entity.setAge((int)cell.getNumericCellValue());
      }else if(cell!=null && cell.getCellType()==cell.CELL_TYPE_STRING){
       entity.setAge(Integer.parseInt(cell.getStringCellValue().trim()));
      }
     }
    }
    list.add(entity);
   }
  }
  return list;
 }
 
 /**
  * 生成2003 Excel
  */
 public static void buildXSLExcel(){
  SimpleDateFormat format = new SimpleDateFormat("yyyyMMddhhmmss");
  String now = format.format(new Date());
        String basePath = System.getProperties().getProperty("user.dir")+File.separator+"Excel"+File.separator;
  String exportFileName = "人员信息导出2003_"+now+".xls";//导出文件名
  
  List<User> list = parseExcel(basePath+"user_2003.xls");
  HSSFWorkbook workBook = null;
  String[] cellTitle = { "序号" , "姓名" , "性别" , "年龄" };
  try {
   workBook = new HSSFWorkbook();//创建工作薄
   HSSFSheet sheet = workBook.createSheet();
   workBook.setSheetName(0, "人员信息");//工作簿名称
   HSSFFont font = workBook.createFont();  
   font.setColor(HSSFFont.COLOR_NORMAL);
   font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
   HSSFCellStyle cellStyle = workBook.createCellStyle();//创建格式
   cellStyle.setFont(font);
   cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
   cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
   //创建第一行标题 
   HSSFRow titleRow = sheet.createRow((short) 0);//第一行标题
   for(int i = 0,size = cellTitle.length; i < size; i++){//创建第1行标题单元格    
    switch(i){
    case 0:
     sheet.setColumnWidth(0, 3000);
     break;
    case 1:
     sheet.setColumnWidth(1,4000);
     break;
    case 2:
     sheet.setColumnWidth(2,4000);
     break;
    case 3:
     sheet.setColumnWidth(3,2000);
     break;
    }
    HSSFCell cell = titleRow.createCell(i,0);        
    cell.setCellStyle(cellStyle);
    cell.setCellValue(cellTitle[i]);
   }
         //从第二行开始写入数据
   //注:此处如果数据过多,会抛出java.lang.IllegalStateException异常:The maximum number of cell styles was exceeded. 
   //You can define up to 4000 styles in a .xls workbook。这是是由于cell styles太多create造成,故一般可以把cellstyle设置放到循环外面
   
   if(list!=null && !list.isEmpty()){
    HSSFCellStyle style = workBook.createCellStyle();//创建格式
    for(int i=0,size=list.size();i<size;i++){
     User entity = list.get(i);
     HSSFRow row = sheet.createRow((short) i+1);
     for (int j = 0,length=cellTitle.length; j < length; j++) {
            HSSFCell cell = row.createCell(j, 0);// 在上面行索引0的位置创建单元格
         cell.setCellType(HSSFCell.CELL_TYPE_STRING);// 定义单元格为字符串类型
         switch(j){// 在单元格中输入一些内容
         case 0://序号
          cell.setCellValue(i+1);
          style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
          cell.setCellStyle(style);
       break;
         case 1://姓名
          cell.setCellValue(entity.getName());
          style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
          cell.setCellStyle(style);
          break;
         case 2://性别
          cell.setCellValue(String.valueOf(entity.getSex()));
          style.setAlignment(HSSFCellStyle.ALIGN_LEFT);
          cell.setCellStyle(style);
          break;
         case 3://年龄
          cell.setCellValue(entity.getAge());
          cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
          style.setAlignment(HSSFCellStyle.ALIGN_LEFT);
          cell.setCellStyle(style);
          break;
         }
     }
          }
   }
      
   // 通过文件输出流生成Excel文件
   File file = new File(basePath+exportFileName);
   FileOutputStream outStream = new FileOutputStream(file);
   workBook.write(outStream);
   outStream.flush();
   outStream.close();
   System.out.println("Excel 2003文件导出完成!导出文件路径:"+file.getPath());
   
   /***
    * Web形式输出Excel
    * 
    */
   /**
   // 表示以附件的形式把文件发送到客户端
   response.setHeader("Content-Disposition", "attachment;filename=" + new String((exportFileName).getBytes(), "ISO-8859-1"));//设定输出文件头
   response.setContentType("application/vnd.ms-excel;charset=UTF-8");// 定义输出类型 
   // 通过response的输出流把工作薄的流发送浏览器形成文件
   OutputStream outStream = response.getOutputStream();
   workBook.write(outStream);
   outStream.flush();
   */
  }catch(IOException e){
   System.out.println("生成人员信息Excel发生IO 异常!"+e.getMessage());
   e.printStackTrace();
  }catch(Exception e){
   System.out.println("文件导出发生异常!异常原因:"+e.getMessage());
   e.printStackTrace();
  }
 }
 
 /**
  * 生成2007 Excel
  */
 public static void buildXSLXExcel(){
  SimpleDateFormat format = new SimpleDateFormat("yyyyMMddhhmmss");
  String now = format.format(new Date());
        String basePath = System.getProperties().getProperty("user.dir")+File.separator+"Excel"+File.separator;
  String exportFileName = "人员信息导出2007_"+now+".xlsx";//导出文件名
  
  List<User> list = parseExcel(basePath+"user_2003.xls");
  XSSFWorkbook workBook = null;
  String[] cellTitle = { "序号" , "姓名" , "性别" , "年龄" };
  try {
   workBook = new XSSFWorkbook();//创建工作薄
   XSSFSheet sheet = workBook.createSheet();
   workBook.setSheetName(0, "人员信息");//工作簿名称
   XSSFFont font = workBook.createFont();  
   font.setColor(XSSFFont.COLOR_NORMAL);
   font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
   XSSFCellStyle cellStyle = workBook.createCellStyle();//创建格式
   cellStyle.setFont(font);
   cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
   cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
   //创建第一行标题 
   XSSFRow titleRow = sheet.createRow((short) 0);//第一行标题
   for(int i = 0,size = cellTitle.length; i < size; i++){//创建第1行标题单元格    
    switch(i){
    case 0:
     sheet.setColumnWidth(0, 3000);
     break;
    case 1:
     sheet.setColumnWidth(1,4000);
     break;
    case 2:
     sheet.setColumnWidth(2,4000);
     break;
    case 3:
     sheet.setColumnWidth(3,2000);
     break;
    }
    XSSFCell cell = titleRow.createCell(i,0);        
    cell.setCellStyle(cellStyle);
    cell.setCellType(XSSFCell.CELL_TYPE_STRING);
    cell.setCellValue(cellTitle[i]);
   }
         //从第二行开始写入数据
   //注:此处如果数据过多,会抛出java.lang.IllegalStateException异常:The maximum number of cell styles was exceeded. 
   //You can define up to 4000 styles in a .xls workbook。这是是由于cell styles太多create造成,故一般可以把cellstyle设置放到循环外面
   
   if(list!=null && !list.isEmpty()){
    XSSFCellStyle style = workBook.createCellStyle();//创建格式
    for(int i=0,size=list.size();i<size;i++){
     User entity = list.get(i);
     XSSFRow row = sheet.createRow((short) i+1);
     for (int j = 0,length=cellTitle.length; j < length; j++) {
            XSSFCell cell = row.createCell(j, 0);// 在上面行索引0的位置创建单元格
         cell.setCellType(XSSFCell.CELL_TYPE_STRING);// 定义单元格为字符串类型
         switch(j){// 在单元格中输入一些内容
         case 0://序号
          cell.setCellValue(i+1);
          style.setAlignment(XSSFCellStyle.ALIGN_CENTER);
          cell.setCellStyle(style);
       break;
         case 1://姓名
          cell.setCellValue(entity.getName());
          style.setAlignment(XSSFCellStyle.ALIGN_CENTER);
          cell.setCellStyle(style);
          break;
         case 2://性别
          cell.setCellValue(String.valueOf(entity.getSex()));
          style.setAlignment(XSSFCellStyle.ALIGN_LEFT);
          cell.setCellStyle(style);
          break;
         case 3://年龄
          cell.setCellValue(entity.getAge());
          cell.setCellType(XSSFCell.CELL_TYPE_NUMERIC);
          style.setAlignment(XSSFCellStyle.ALIGN_LEFT);
          cell.setCellStyle(style);
          break;
         }
     }
          }
   }
      
   // 通过文件输出流生成Excel文件
   File file = new File(basePath+exportFileName);
   FileOutputStream outStream = new FileOutputStream(file);
   workBook.write(outStream);
   outStream.flush();
   outStream.close();
   System.out.println("Excel 2007文件导出完成!导出文件路径:"+file.getPath());
   
   /***
    * Web形式输出Excel
    * 
    */
   /**
   // 表示以附件的形式把文件发送到客户端
   response.setHeader("Content-Disposition", "attachment;filename=" + new String((exportFileName).getBytes(), "ISO-8859-1"));//设定输出文件头
   response.setContentType("application/vnd.ms-excel;charset=UTF-8");// 定义输出类型 
   // 通过response的输出流把工作薄的流发送浏览器形成文件
   OutputStream outStream = response.getOutputStream();
   workBook.write(outStream);
   outStream.flush();
   */
  }catch(IOException e){
   System.out.println("生成人员信息Excel发生IO 异常!"+e.getMessage());
   e.printStackTrace();
  }catch(Exception e){
   System.out.println("文件导出发生异常!异常原因:"+e.getMessage());
   e.printStackTrace();
  }
 }
}
class User {
 private String name;
 private String sex;
 private int age;
 
 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 int getAge() {
  return age;
 }
 public void setAge(int age) {
  this.age = age;
 }
 
}

OK,完毕!



© 著作权归作者所有

共有 人打赏支持
IceRainYWC
粉丝 13
博文 111
码字总数 49297
作品 0
石家庄
程序员
私信 提问
加载中

评论(2)

t
tianyaduan
看起来要比Spread Studio实现的导入导出Excel复杂一些
Oscarfff
Oscarfff
我导入你所说的这几个包还是不能实例化Workbook wb=WorkbookFactory.create(inp);
POI - 读取Excel2003、Excel2007或更高级的兼容性问题

我们使用POI中的HSSFWorkbook来读取Excel数据。 上边代码,读取Excel2003(xls)的文件没问题,但是一旦读取的是Excel2007(xlsx)的文件,就会报异常:“The supplied data appears to be i...

技术小美
2017/11/14
0
0
数据导入导出工具--DataPie

DataPie支持SQL server、SQLite、ACCESS数据库的导入、导出、存储过程调用,支持EXCEL2007、EXCEL2003、ACCESS2007、 CSV文件导入数据库,支持EXCEL、CSV文件方式导出,支持数据拆分导出及自...

不锈的阳光
2012/02/04
4.8K
0
jfinal 操作poi

@JFinal 你好,想跟你请教个问题: 我在弄项目的时候需要用poi操作excel,但是我发现在弄excel2003 也就是HSSFWorkbook的时候,没问题,但是需求要用2007,也就是要用XSSFWorkbook,当我在弄...

chrishao
2014/02/18
502
1
[转]Java大数据量导出Excel的问题

试共同条件: 数据总数为110011条,每条数据条数为19个字段。 电脑配置为:P4 2.67GHz,1G内存。 一、POI、JXL、FastExcel比较 POI、JXL、FastExcel均为java第三方开源导出Excel的开源项目。...

大冬
2011/07/28
0
1
Java POI读取Office excel (2003,2007)及相关jar包

poi-3.7-20101029.jar,下载地址:http://download.csdn.net/detail/evangel_z/4107089 geronimo-stax-api1.0spec-1.0.jar,下载地址:http://download.csdn.net/detail/evangel_z/4107083 x......

姚君
2014/04/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

记录replugin使用的一个坑

反复编译插件放入宿主中,一直出现如下错误: android.content.res.Resources$NotFoundException: Resource ID #0x7f050000 type #0x5 is not valid 回滚代码,重启AS还是出错。最终发现将宿...

Gemini-Lin
今天
1
0
Vert.x系列(二)--EventBusImpl源码分析

前言:Vert.x 实现了2种完成不同的eventBus: EventBusImpl(A local event bus implementation)和 它的子类 ClusteredEventBus(An event bus implementation that clusters with other Ve......

冷基
今天
1
0
Perl - 获取文件项目

参考:http://www.runoob.com/perl/perl-directories.html 下面返回JSON格式的文件列表 #!/usr/bin/perluse strict;use warnings;use utf8;use feature ':5.26';require Fi......

wffger
昨天
2
0
vue组件系列3、查询下载

直接源码,虽然样式样式不好看,逻辑也不是最优,但是可以留作纪念。毕竟以后类似的功能只需要优化就可以了,不用每次都重头开始。。。 <template> <div class="pre_upload"> <div ...

轻轻的往前走
昨天
2
0
java浅复制和深复制

之前写了数组的复制,所以这里继续总结一下浅复制和深复制。 浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝。 深拷贝:对基本数据类型进行值传递,对引用数据类型,...

woshixin
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部