我想做一个将查询数据导出成excel文件的功能。action代码如下,使用struts2,获取数据的代码太多,省略了。
public class ReportAction extends ActionSupport{
private static HSSFWorkbook wb = new HSSFWorkbook();
private static HSSFSheet sheet = wb.createSheet(); /**
* 补贴报表导出.
*
* @author caoyb
* @version $Revision:$
*/
public String export_excel_expense(){
ExportExcel exportExcel = new ExportExcel(wb, sheet); // 创建最后一行的合计行
String[] cellValue = new String[number - 1];
for (int i = 0; i < number - 1; i++) {
if (i ==0) {
cellValue[i] = String.valueOf(people);
}else if (i == 1) {
cellValue[i] = String.valueOf(table);
}else {
int zongji = Math.round(sum);
cellValue[i] = String.valueOf(zongji);
}
}
exportExcel.createLastSumRow(1, cellValue);
System.out.println("2, sheet.getLastRowNum() = "+sheet.getLastRowNum());
JFileChooser Chooser = new JFileChooser();
Chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
Chooser.showOpenDialog(null);
String path = Chooser.getSelectedFile().getPath();
exportExcel.outputExcel(path+".xls");
tool.getRequest().setAttribute("msg", "导出成功,存放地址为:"+path+".xls");
return "Success";
}
上面红色的方法:
public class ExportExcel {
private HSSFWorkbook wb = null;
private HSSFSheet sheet = null;
/**
* 创建合计行
* @param colSum 需要合并到的列索引
* @param cellValue
*/
public void createLastSumRow(int colSum, String[] cellValue) { HSSFCellStyle cellStyle = wb.createCellStyle();
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定单元格垂直居中对齐
cellStyle.setWrapText(true);// 指定单元格自动换行 // 单元格字体
HSSFFont font = wb.createFont();
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
font.setFontName("宋体");
font.setFontHeight((short) 250);
cellStyle.setFont(font); HSSFRow lastRow = sheet.createRow((short) (sheet.getLastRowNum() + 1)); System.out.println("sheet.getLastRowNum() + 1 = "+sheet.getLastRowNum() + 1);
HSSFCell sumCell = lastRow.createCell(0); sumCell.setCellValue(new HSSFRichTextString("合计"));
sumCell.setCellStyle(cellStyle);
sheet.addMergedRegion(new Region(sheet.getLastRowNum(), (short) 0,
sheet.getLastRowNum(), (short) colSum));// 指定合并区域 for (int i = 2; i < (cellValue.length + 2); i++) {
sumCell = lastRow.createCell(i);
sumCell.setCellStyle(cellStyle);
sumCell.setCellValue(new HSSFRichTextString(cellValue[i-2])); } }
}
问题就是出在这个方法上,每次启动服务器导出的时候,第一次是正常的,然后后面再次导出的就不对了,后面导出的文件里都会存有上次导出时的合计行。JavaExcelstruts
public class ReportAction extends ActionSupport{
private static HSSFWorkbook wb = new HSSFWorkbook();
private static HSSFSheet sheet = wb.createSheet(); /**
* 补贴报表导出.
*
* @author caoyb
* @version $Revision:$
*/
public String export_excel_expense(){
ExportExcel exportExcel = new ExportExcel(wb, sheet); // 创建最后一行的合计行
String[] cellValue = new String[number - 1];
for (int i = 0; i < number - 1; i++) {
if (i ==0) {
cellValue[i] = String.valueOf(people);
}else if (i == 1) {
cellValue[i] = String.valueOf(table);
}else {
int zongji = Math.round(sum);
cellValue[i] = String.valueOf(zongji);
}
}
exportExcel.createLastSumRow(1, cellValue);
System.out.println("2, sheet.getLastRowNum() = "+sheet.getLastRowNum());
JFileChooser Chooser = new JFileChooser();
Chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
Chooser.showOpenDialog(null);
String path = Chooser.getSelectedFile().getPath();
exportExcel.outputExcel(path+".xls");
tool.getRequest().setAttribute("msg", "导出成功,存放地址为:"+path+".xls");
return "Success";
}
上面红色的方法:
public class ExportExcel {
private HSSFWorkbook wb = null;
private HSSFSheet sheet = null;
/**
* 创建合计行
* @param colSum 需要合并到的列索引
* @param cellValue
*/
public void createLastSumRow(int colSum, String[] cellValue) { HSSFCellStyle cellStyle = wb.createCellStyle();
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定单元格垂直居中对齐
cellStyle.setWrapText(true);// 指定单元格自动换行 // 单元格字体
HSSFFont font = wb.createFont();
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
font.setFontName("宋体");
font.setFontHeight((short) 250);
cellStyle.setFont(font); HSSFRow lastRow = sheet.createRow((short) (sheet.getLastRowNum() + 1)); System.out.println("sheet.getLastRowNum() + 1 = "+sheet.getLastRowNum() + 1);
HSSFCell sumCell = lastRow.createCell(0); sumCell.setCellValue(new HSSFRichTextString("合计"));
sumCell.setCellStyle(cellStyle);
sheet.addMergedRegion(new Region(sheet.getLastRowNum(), (short) 0,
sheet.getLastRowNum(), (short) colSum));// 指定合并区域 for (int i = 2; i < (cellValue.length + 2); i++) {
sumCell = lastRow.createCell(i);
sumCell.setCellStyle(cellStyle);
sumCell.setCellValue(new HSSFRichTextString(cellValue[i-2])); } }
}
问题就是出在这个方法上,每次启动服务器导出的时候,第一次是正常的,然后后面再次导出的就不对了,后面导出的文件里都会存有上次导出时的合计行。JavaExcelstruts
去下载试下吧,这是我以前写的一个关于导入导出功能的一个文档
包括源代码和使用说明
如果我想的话那么我会认为是你上次导出的时候使用的那个存储合计行的对象仍是同一个,而且未被清空未被赋予新值。
用POI的方式导出报表我也经常做,我一般是把生成excel表写成一个工具类,如果想添加什么新的功能的话就继承这个工具类在重写某些需要的方法。
另外楼主有没有想过生成报表的话直接从web页面返回一份文件更为恰当,而不是把文件输出到指定的位置?
我的excel工具类,很早以前的,
http://bbs.csdn.net/topics/390360927
只是参考下吧,
这个改了好多了,只是最新版本留在公司了,而现在仍在苦逼的学校里准备毕业。