poi报表导出mysql表,如何使用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", "p_w_upload; 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三个包

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值