最开始用iText生成pdf报表,可是管理流程竟然要求生成excel然后再通过人工审核,所以不得不借用组件去生成Excel文档,一开发现的就是apache的POI.因为我原来用的制作报表的工具是iReport
+
Jasper ,好像它支持的也是POI组件。
我找了一些资料,大部分说得都是直接生成Excel文档,下载到本机操作,可是现在想把Excel在网页页面显示,因为这种过程比较直观,然后根据需求,看是否需要下载到本机。
生成Excel比较简单,非常类似于网页表格的生成。
Excel的三大元素:
1 .文档本体 HSSFSheet
2 .文档行 HSSFRow
3 .文档单元格 HSSFCell
不过操作这一切之前,你要先建立一个工程。
操作流程就是: 建一个工程,在此工程下建一个文档,增加行,增加单元格 我想无论多么复杂,应该大体过程都如此。
下面这一段是一个简单构建过程:
HSSFWorkbook wb = new HSSFWorkbook(); // 建立一工程
HSSFSheet sheet = wb.createSheet( " mySheet " ); // 生成一个文档实体(参数可选)
HSSFRow row = sheet.createRow(( short ) 0 ); // 增加一行,行号必须为短整型
HSSFCell cell = row.createCell(( short ) 0 ); // 增加单元格,可一行多格
cell.setEncoding(HSSFWorkbook.ENCODING_UTF_16); // 中文非要加上这一句,要不乱码
cell.setCellValue( 1 ); // 置值 // 你也可以一行做完全部的事
row.createCell(( short ) 1 ).setCellValue( 1.2 );
row.createCell(( short ) 2 ).setCellValue( " This is a string " );
row.createCell(( short ) 3 ).setCellValue( true ); // 输出到文档 这一部也是要我们做的,就把数据流倒到jsp页
FileOutputStream fileOut = new FileOutputStream( " workbook.xls " );
wb.write(fileOut);
fileOut.close();
这中表格很朴素,机会没有用到诸如字体设置,样式风格,甚至很严重的中文问题也没有考虑 ,不过这是万里长征第一步,也是增强自信心的第一步。那么接下来我们一步一步打造一个完整的Excel报表.
单元格样式
HSSFFont cf = workbook.createFont(); // 基本字体
HSSFCellStyle cs = workbook.createCellStyle(); // 单元格样式
cf.setFontHeightInPoints(( short ) 12 ); // 字体大小
cf.setColor(HSSFFont.COLOR_RED); // 字体颜色 注意使用HSSFont下的颜色常量
cf.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); // 字体粗细
cs.setFont(cf); // 设置字体样式
cs.setAlignment(HSSFCellStyle.ALIGN_RIGHT); // 对齐方式
这里只简单介绍,接下来,看一下如何把这些东西搬到jsp页面。
以下是写的一个方法,实际应该是有数据库链接的,出于简单考虑,直接写些数据就了事。
public ByteArrayOutputStream resultSetToExcel(ByteArrayOutputStream buffer) {
HSSFWorkbook workbook =new HSSFWorkbook();
HSSFSheet sheet =workbook.createSheet();
HSSFRow aRow =null;
HSSFCell aCell =null;
HSSFFont headFont =workbook.createFont();
HSSFCellStyle headStyle=workbook.createCellStyle();
headFont.setFontHeightInPoints((short)12);
headFont.setColor(HSSFFont.COLOR_RED);
headFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
headFont.setFontName("宋体");
headStyle.setFont(headFont);
short currRowNum = 0;
try {
int columnCount = 10 row =sheet.createRow(currRowNum++);
for (int i=0; i < columnCount; i++) {
aCell =aRow.createCell((short)i);
aCell.setEncoding(HSSFWorkbook.ENCODING_UTF_16);
aCell.setCellValue("字段" + i);
aCell.setCellStyle(headStyle);
}
for (int i=0; i < 10; i++) {
aRow = sheet.createRow(currRowNum++);
for(int j = 0 ; j < columnCount ; j ++){
aCell = aRow.createCell( (short) j);
aCell.setCellValue(j);
}
}
workbook.write(buffer);
}
catch(Exception ex1){
ex1.printStackTrace();
}
return buffer;
}
jsp页面的代码如下: 其中myExcel 是我写的一个用上面方法组成的一个类
<% @ page import = " java.io.* " %><% @ page import = " javax.servlet.* " %><% @ page import = " org.apache.poi.hssf.util.* " %><% ByteArrayOutputStream buffer = new ByteArrayOutputStream();
com.print.demo.MyExcel myExcel = new com.print.demo.MyExcel();
buffer = myExcel.resultSetToExcel(buffer);
byte [] bytes = buffer.toByteArray();
response.reset(); // 以前一直没写,出现乱码.
response.setContentType( " application/vnd.ms-excel " ); // response.setContentLength(bytes.length);
DataOutput output = new DataOutputStream( response.getOutputStream() );
for ( int i = 0 ; i < bytes.length; i ++ ) { output.writeByte( bytes[i] ); } %>
大体如此。 具体细节,自己以后慢慢调试。
简单的使用是应该没问题的。
Trackback: http: // tb.blog.csdn.net/TrackBack.aspx?PostId=559927
我找了一些资料,大部分说得都是直接生成Excel文档,下载到本机操作,可是现在想把Excel在网页页面显示,因为这种过程比较直观,然后根据需求,看是否需要下载到本机。
生成Excel比较简单,非常类似于网页表格的生成。
Excel的三大元素:
1 .文档本体 HSSFSheet
2 .文档行 HSSFRow
3 .文档单元格 HSSFCell
不过操作这一切之前,你要先建立一个工程。
操作流程就是: 建一个工程,在此工程下建一个文档,增加行,增加单元格 我想无论多么复杂,应该大体过程都如此。
下面这一段是一个简单构建过程:
HSSFWorkbook wb = new HSSFWorkbook(); // 建立一工程
HSSFSheet sheet = wb.createSheet( " mySheet " ); // 生成一个文档实体(参数可选)
HSSFRow row = sheet.createRow(( short ) 0 ); // 增加一行,行号必须为短整型
HSSFCell cell = row.createCell(( short ) 0 ); // 增加单元格,可一行多格
cell.setEncoding(HSSFWorkbook.ENCODING_UTF_16); // 中文非要加上这一句,要不乱码
cell.setCellValue( 1 ); // 置值 // 你也可以一行做完全部的事
row.createCell(( short ) 1 ).setCellValue( 1.2 );
row.createCell(( short ) 2 ).setCellValue( " This is a string " );
row.createCell(( short ) 3 ).setCellValue( true ); // 输出到文档 这一部也是要我们做的,就把数据流倒到jsp页
FileOutputStream fileOut = new FileOutputStream( " workbook.xls " );
wb.write(fileOut);
fileOut.close();
这中表格很朴素,机会没有用到诸如字体设置,样式风格,甚至很严重的中文问题也没有考虑 ,不过这是万里长征第一步,也是增强自信心的第一步。那么接下来我们一步一步打造一个完整的Excel报表.
单元格样式
HSSFFont cf = workbook.createFont(); // 基本字体
HSSFCellStyle cs = workbook.createCellStyle(); // 单元格样式
cf.setFontHeightInPoints(( short ) 12 ); // 字体大小
cf.setColor(HSSFFont.COLOR_RED); // 字体颜色 注意使用HSSFont下的颜色常量
cf.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); // 字体粗细
cs.setFont(cf); // 设置字体样式
cs.setAlignment(HSSFCellStyle.ALIGN_RIGHT); // 对齐方式
这里只简单介绍,接下来,看一下如何把这些东西搬到jsp页面。
以下是写的一个方法,实际应该是有数据库链接的,出于简单考虑,直接写些数据就了事。
public ByteArrayOutputStream resultSetToExcel(ByteArrayOutputStream buffer) {
HSSFWorkbook workbook =new HSSFWorkbook();
HSSFSheet sheet =workbook.createSheet();
HSSFRow aRow =null;
HSSFCell aCell =null;
HSSFFont headFont =workbook.createFont();
HSSFCellStyle headStyle=workbook.createCellStyle();
headFont.setFontHeightInPoints((short)12);
headFont.setColor(HSSFFont.COLOR_RED);
headFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
headFont.setFontName("宋体");
headStyle.setFont(headFont);
short currRowNum = 0;
try {
int columnCount = 10 row =sheet.createRow(currRowNum++);
for (int i=0; i < columnCount; i++) {
aCell =aRow.createCell((short)i);
aCell.setEncoding(HSSFWorkbook.ENCODING_UTF_16);
aCell.setCellValue("字段" + i);
aCell.setCellStyle(headStyle);
}
for (int i=0; i < 10; i++) {
aRow = sheet.createRow(currRowNum++);
for(int j = 0 ; j < columnCount ; j ++){
aCell = aRow.createCell( (short) j);
aCell.setCellValue(j);
}
}
workbook.write(buffer);
}
catch(Exception ex1){
ex1.printStackTrace();
}
return buffer;
}
jsp页面的代码如下: 其中myExcel 是我写的一个用上面方法组成的一个类
<% @ page import = " java.io.* " %><% @ page import = " javax.servlet.* " %><% @ page import = " org.apache.poi.hssf.util.* " %><% ByteArrayOutputStream buffer = new ByteArrayOutputStream();
com.print.demo.MyExcel myExcel = new com.print.demo.MyExcel();
buffer = myExcel.resultSetToExcel(buffer);
byte [] bytes = buffer.toByteArray();
response.reset(); // 以前一直没写,出现乱码.
response.setContentType( " application/vnd.ms-excel " ); // response.setContentLength(bytes.length);
DataOutput output = new DataOutputStream( response.getOutputStream() );
for ( int i = 0 ; i < bytes.length; i ++ ) { output.writeByte( bytes[i] ); } %>
大体如此。 具体细节,自己以后慢慢调试。
简单的使用是应该没问题的。
Trackback: http: // tb.blog.csdn.net/TrackBack.aspx?PostId=559927