如何使用POI对Excel表进行导入和导出

Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

结构:

HSSF - 提供读写Microsoft Excel格式档案的功能。

XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。

HWPF - 提供读写Microsoft Word格式档案的功能。

HSLF - 提供读写Microsoft PowerPoint格式档案的功能。

HDGF - 提供读写Microsoft Visio格式档案的功能。

其实使用POI进行导入和导出非常简单,这里需要说明的是,此处只使用HSSF,即只能对Excel2003进行导入和导出,如果要对Excel2007以及更高版本的Excel,则需要使用XSSF

如何使用POI对Excel进行导入:

流程:得到workbook对象(即excel文件)--> 根据workbook对象得到sheet对象(即工作薄对象) --> 根据sheet对象得到row对象(即行对象) --> 根据row对象得到cell对象(即单元格对象)

下面使用grails举例,与java语言类似

1.在页面处定义一个type为file的input

2.得到这个文件的输入流

def excelFile = request.getFile(‘content‘)  //获得Excel文件

def is = excelFile.getInputStream()  //获得文件输入流

3.构造workbook对象,把输入流作为参数构造workbook对象

def workbook = new HSSFWorkbook(is)

4.构造sheet对象,根据工作薄名字构造sheet对象
        HSSFSheet sheet = workbook.getSheet("工资表")

5.得到最后的行序号,对所有的行进行迭代

def currPosition = 0

StringBuffer buffer = new StringBuffer()

while(true){
           if(currPosition > sheet.getLastRowNum()){
               break
           else{
               int row = currPosition;
               currPosition ++
               //抓取当前行数据
               buffer.append(getLine(sheet, row)).append("\r");
           }
         }

//读取每一行数据的方法

String getLine(HSSFSheet sheet, int row){
        //根据行数取得sheet的一行
        HSSFRow rowline = sheet.getRow(row);
        //获取当前行的列数
        int filedColumns = rowline.getLastCellNum();
        HSSFCell cell = null;
        StringBuffer buffer = new StringBuffer();
        String cellvalue = null

//迭代当前行的每一列,得到所有列的值
        for(int i =0; i < filedColumns; i++){
                cell = rowline.getCell((short)i);
                cellvalue = ExcelTool.getCellValue(cell);
                buffer.append(cellvalue).append("\t");
        }
        return buffer.toString();
    }

//抓取每一个单元格的工具方法

class ExcelTool {
    public static String getCellValue(HSSFCell cell) {
        String value = "";
        if (null == cell)
                return value;
        switch (cell.getCellType()) {

//分析单元格数据类型
        case Cell.CELL_TYPE_STRING://字符串类型
                value = (cell.getStringCellValue() == null) ? "" : cell
                                .getStringCellValue();
                break;
        case Cell.CELL_TYPE_NUMERIC://数值类型

//数值类型也分为日期类型和普通数值类型
                if(HSSFDateUtil.isCellDateFormatted(cell)){
                    Date date  = cell.getDateCellValue()
                    value = date.format("yyyy-MM-dd")
                }else{
                    value = CommonTool.NVL(String.valueOf(cell.getNumericCellValue()), "0");
                }
                break;
        //公式类型(此处如果使用getNumericCellValue()方法进行抓取,那么得到的数据将是公式的

//字面值,而不是公式本身)

case Cell.CELL_TYPE_FORMULA:

BigDecimal bd = new BigDecimal(cell.getNumericCellValue())
                bd = bd.setScale(2, BigDecimal.ROUND_HALF_UP)
                value = String.valueOf(bd);
                break;

//布尔类型
        case Cell.CELL_TYPE_BOOLEAN:
                value = cell.getBooleanCellValue() + "";
                break;

//错误类型
        case Cell.CELL_TYPE_ERROR:
                value = cell.getErrorCellValue() + "";
                break;

//其他类型
        default:
                break;
        }
        return value;
    }
}

6.此时excel表的数据已经完全导入到程序里面,那么如何处理就看业务需要了

如何使用POI对Excel进行导出:

流程:构造一个空文件对象--> 根据文件对象构造一个空的输出流 -->  --> 构造sheet对象 --> 根据sheet对象得到row对象(即行对象) --> 根据row对象得到cell对象(即单元格对象)--> 单元格内填充值

下面使用grails举例,与java语言类似

1.File file = new File("工资表");  //构造文件对象

2.FileOutputStream fos = new FileOutputStream(file);//构造文件输出流对象

3.HSSFWorkbook wb = new HSSFWorkbook(); // 构造workbook对象

4.HSSFSheet sheet = wb.createSheet("工资表"); // 构造工作薄对象

5.HSSFRow row1 = sheet.createRow(0); // 构造行对象

6.HSSFCell cellA1 = row1.createCell(0, Cell.CELL_TYPE_STRING);//构造单元格对象

7.cellA1.setCellValue("工资表"); //在单元格内填充值

8.wb.write(fos); // 把workbook对象写入到输出流

9.fos.close();// 关闭输出流

10.在响应中设置文件头和内容类型,表示响应的是一个excel表格类型

response.setHeader("Content-disposition", "attachment; fileName=" + new String(fileName.getBytes("utf-8"),"iso8859-1"))
    response.contentType = "application/x-rarx-rar-compressed"

11.把文件写出到响应中,响应到页面进行下载

def out = response.outputStream
        def inputStream = new FileInputStream(file)
        byte[] buffer = new byte[1024]
        int i = -1
        while ((i = inputStream.read(buffer)) != -1) {
            out.write(buffer, 0, i)
        }
        out.flush()
        out.close()
        inputStream.close()

ps:此处javaJDK版本为1.7,POI版本为3.7,使用POI需要导poi-3.7-20101029.jar,poi-ooxml-3.7-20101029.jar,poi-ooxml-schemas-3.7-20101029.jar三个包

时间: 2024-11-08 08:36:58

如何使用POI对Excel表进行导入和导出的相关文章

Java版将EXCEL表数据导入到数据库中

1.采用第三方控件JXL实现 try { //实例化一个工作簿对象 Workbook workBook=Workbook.getWorkbook(new File("F://qzlx.xls")); //获取该工作表中的第一个工作表 Sheet sheet=workBook.getSheet(0); //获取该工作表的行数,以供下面循环使用 int rowSize=sheet.getRows(); for(int i=0;i<rowSize;i++) { //编号 String

【最后的冲刺】android中excel表的导入和数据处理

[最后的冲刺]android中excel表的导入和数据处理 --学校课程的查询和修改 1.编写 The Class类把课程表courses.db当做一个实体类,hashcode和equals这两个类是为了判断输入的查询内容和Excel表中的内容是否一致. 并在java里面区别两个对象是否一致 1 public class TheClass { 2 private String classname; 3 private String type; 4 private String teacher;

Excel表数据导入Sql Server数据库中

Excel表数据导入Sql Server数据库的方法很多,这里只是介绍了其中一种: 1.首先,我们要先在test数据库中新建一个my_test表,该表具有三个字段tid int类型, tname nvarchar类型, tt nvarchar类型(注意:my_test表中的数据类型必须与Excel中相应字段的类型一致) 2. 我们用SELECT * FROM  OPENROWSET( 'Microsoft.Jet.OLEDB.4.0 ', 'Excel  5.0;DatabASE=[Excel表

Excel表数据导入数据库表中

***Excel表数据导入到数据库表中 通过数据库表的模板做成‘Excel’表的数据导入到数据库相应的表中(注意:主表 和 从表的关系,要先导‘主表’在导入从表) 过程:通过数据库的导入工具—先导入为一张临时表,在插入到正式表中.语句如下: --YK_TYPK插入数据 insert into YK_TYPK --插入'YK_TYPK(通用品库)'数据 select * from Sheet1$_TYPK_caoyao ---------------------------------------

表的导入与导出

导出在某些情况下,为了一些特定的目的,经常需要将表里的数据导出为某些符号分割的纯文本,而不是sql语句,这些应用可能有以下一些:用来作为excel显示单纯为了节省备份空间为了快速的加载数据,load data的加载速度比普通的sql加载要快20倍以上(书上抄的,没有实测)方法1select ....into outfile 命令来导出数据,具体语句如下:select * from tablename into outfile 'target_file' [option];option 参数可以是

EXCEL表数据导入到ORACLE数据库中

将EXCEL表导入ORACLE数据库中 一.建立表 1.建立表 2.查询表 select * from yy; 二.导入程序 在excel中找到需要导入的数据 2.将excel中的数据另存为文本文件(有制表符分割的) 3.在pl*sql中选择tools-->text importer,在出现的窗口中选择"Data from Textfile",然后再选择"Open data file", 在弹出的文件选择框中选中保存有数据的文本文件,此时将会看到data fr

【爱上Java8】使用POI读取Excel表

最近有这么一个小需求,需要从Excel里读取2张表.如果是表1和表2,那么比较表1,表2,列出在表1中存在,但是表2中不存在的项,以及在表2中存在,在表1中不存在的项.使用POI可以很轻松的完成这个功能.首先,为表建模,表项为:部门代码 部门名称 职位名称 职员代码 职员姓名每一行为一个职员的信息.使用职员代码来标示每一行. 12345678910111213141516171819202122232425262728 package zhoukai; import org.apache.poi

thinkphp5中的excel表的导入导出

首先将PHPExcel文件放到vendor中 PHPExcel下载地址:https://pan.baidu.com/s/1GjbcSXxHwbLeBw8NzzIBYA 提取码:zbqq 数据导出到excel中 控制器中引入类文件 vendor ( 'PHPExcel' );vendor ( 'PHPExcel.PHPExcel_IOFactory' );vendor ( 'PHPExcel.PHPExcel_Cell' ); 控制器php代码 public function index()//E

将excel表数据导入sqlserver2008R2 报错

错误信息: 正在复制到 [dbo].[Sheet1sss$] (错误)消息错误 0xc020901c: 数据流任务 1: 输出“Excel 源输出”(9) 上的 输出列“FDESC”(93) 出错.返回的列状态是:“文本被截断,或者一个或多个字符在目标代码页中没有匹配项.”. (SQL Server 导入和导出向导) 错误 0xc020902a: 数据流任务 1: “输出列“FDESC”(93)”由于发生截断而失败,而且针对“输出列“FDESC”(93)”的截断行处理设置指定截断时出错.在指定组