我們使用POI技術來導出和導入我們之前的使用者清單。POI在之前的《傑信商貿》工程中已經詳細介紹過了,這裡就不贅述。我們直接上手開發。
首先說下一我們的POI列印的流程,我們接下來就按照這個流程開發:
1、建立工作簿
1.1、建立合并單元格對象
1.2、頭标題樣式
1.3、列标題樣式
2、建立工作表
2.1、加載合并單元格對象
3、建立行
3.1、建立頭标題行;并且設定頭标題
3.2、建立列标題行;并且設定列标題
4、操作單元格;将使用者清單寫入excel
5、輸出
可以回顧一下我們之前的使用者清單:
可以看到這裡有“導入”和“導出”的按鈕,可以對清單的資料進行excel文本的導入和導出工作。
我們列印的最終效果:
首先我們要先導入POI的jar包:
poi-3.11-20141221.jar
poi-ooxml-3.11-20141221.jar
poi-ooxml-schemas-3.11-20141221.jar
我們在清單的界面的“導出”按鈕部分添加點選事件的js代碼,是我們能夠點選跳轉發到相應的action去執行列印excel表的操作:
//導出清單
function doExportExcel(){
window.open("${basePath}tax/user_exportExcel.action");
}
我們在UserAction類中添加exportExcel方法來列印資料:
//導出清單
public void exportExcel(){
try {
//1.查找使用者清單
userList=userService.findObjects();
//2.導出
HttpServletResponse response=ServletActionContext.getResponse();
//告訴浏覽器要彈出的文檔類型
response.setContentType("application/x-execl");
//告訴浏覽器這個文檔要作為附件給别人下載下傳(防止浏覽器不相容,檔案名要編碼)
response.setHeader("Content-Disposition", "attachment;filename="+new String("使用者清單.xls".getBytes(),"ISO-8859-1"));
//擷取輸出流
ServletOutputStream outputStream= response.getOutputStream();
userService.exportExcel(userList,outputStream);
if(outputStream !=null){
outputStream.close();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
userService.exportExcel(userList,outputStream);這個方法我們還沒有實作,是以我們在userService接口中定義這個方法:
/
/導出清單
public void exportExcel(List<User> userList,ServletOutputStream outputStream);
然後在userServiceImpl類中去實作這個方法:
@Override
public void exportExcel(List<User> userList,
ServletOutputStream outputStream) {
try {
//1.建立工作簿
HSSFWorkbook workbook=new HSSFWorkbook();
//1.1建立合并單元格對象
CellRangeAddress cellRangeAddress=new CellRangeAddress(0,0,0,4);//起始行号,結束行号,起始列号,結束列号
//1.2、頭标題樣式
HSSFCellStyle style1=creatCellStyle(workbook,(short)16);
//1.3、列标題樣式
HSSFCellStyle style2=creatCellStyle(workbook,(short)13);
//2、建立工作表
HSSFSheet sheet=workbook.createSheet("使用者清單");
//2.1、加載合并單元格對象
sheet.addMergedRegion(cellRangeAddress);
//設定預設列寬
sheet.setDefaultColumnWidth(20);
//3.建立行
//3.1、建立頭标題行;并設定頭标題
HSSFRow row1=sheet.createRow(0);
HSSFCell cell1=row1.createCell(0);
//加載單元格樣式
cell1.setCellStyle(style1);
cell1.setCellValue("使用者清單");
//3.2、建立列标題行,并設定列标題
HSSFRow row2=sheet.createRow(1);
String []titles={"使用者名","賬号","所屬部門","性别","電子郵箱"};
for (int i = 0; i < titles.length; i++) {
HSSFCell cell2=row2.createCell(i);
//加載單元格樣式
cell2.setCellStyle(style2);
cell2.setCellValue(titles[i]);
}
//4、操作單元格,将使用者寫入Execl
if(userList!=null){
for (int j = 0; j < userList.size(); j++) {
HSSFRow row=sheet.createRow(j+2);
HSSFCell cell11=row.createCell(0);
cell11.setCellValue(userList.get(j).getName());
HSSFCell cell12=row.createCell(1);
cell12.setCellValue(userList.get(j).getAccount());
HSSFCell cell13=row.createCell(2);
cell13.setCellValue(userList.get(j).getDept());
HSSFCell cell14=row.createCell(3);
cell14.setCellValue(userList.get(j).isGender()?"男":"女");
HSSFCell cell15=row.createCell(4);
cell15.setCellValue(userList.get(j).getEmail());
}
}
//5、輸出
workbook.write(outputStream);
workbook.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 建立單元格樣式
* @param workbook 工作簿
* @param fontSize 字型大小
* @return 單元格樣式
* */
private HSSFCellStyle creatCellStyle(HSSFWorkbook workbook,short fontSize) {
HSSFCellStyle style=workbook.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水準居中
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
//建立字型
HSSFFont font=workbook.createFont();
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//加粗字型
font.setFontHeightInPoints(fontSize);
//加載字型
style.setFont(font);
return style;
}
下面進行測試:
點選導出
然後導出對話框,點選下載下傳:
得到檔案,打開之後發現就是我們所要的結果:
至此,我們的使用者清單導入列印成功!
這裡要注意的是,我們因為列印這一項功能就占據了Service的大部分空間,使得Service方法過于臃腫,是以我們要将列印方法抽取出來,放在一個專門提供列印服務的類中,是以我們專門編寫一個工具類:
package cn.edu.hpu.tax.core.util;
import java.util.List;
import javax.servlet.ServletOutputStream;
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.hssf.util.CellRangeAddress;
import cn.edu.hpu.tax.user.entity.User;
public class ExcelUtil {
/**
* 導出使用者的所有清單到Execl
* @param userList 使用者清單
* @param outputStream 輸出流
* */
public static void exportExcel(List<User> userList,
ServletOutputStream outputStream) {
try {
//1.建立工作簿
HSSFWorkbook workbook=new HSSFWorkbook();
//1.1建立合并單元格對象
CellRangeAddress cellRangeAddress=new CellRangeAddress(0,0,0,4);//起始行号,結束行号,起始列号,結束列号
//1.2、頭标題樣式
HSSFCellStyle style1=creatCellStyle(workbook,(short)16);
//1.3、列标題樣式
HSSFCellStyle style2=creatCellStyle(workbook,(short)13);
//2、建立工作表
HSSFSheet sheet=workbook.createSheet("使用者清單");
//2.1、加載合并單元格對象
sheet.addMergedRegion(cellRangeAddress);
//設定預設列寬
sheet.setDefaultColumnWidth(20);
//3.建立行
//3.1、建立頭标題行;并設定頭标題
HSSFRow row1=sheet.createRow(0);
HSSFCell cell1=row1.createCell(0);
//加載單元格樣式
cell1.setCellStyle(style1);
cell1.setCellValue("使用者清單");
//3.2、建立列标題行,并設定列标題
HSSFRow row2=sheet.createRow(1);
String []titles={"使用者名","賬号","所屬部門","性别","電子郵箱"};
for (int i = 0; i < titles.length; i++) {
HSSFCell cell2=row2.createCell(i);
//加載單元格樣式
cell2.setCellStyle(style2);
cell2.setCellValue(titles[i]);
}
//4、操作單元格,将使用者寫入Execl
if(userList!=null){
for (int j = 0; j < userList.size(); j++) {
HSSFRow row=sheet.createRow(j+2);
HSSFCell cell11=row.createCell(0);
cell11.setCellValue(userList.get(j).getName());
HSSFCell cell12=row.createCell(1);
cell12.setCellValue(userList.get(j).getAccount());
HSSFCell cell13=row.createCell(2);
cell13.setCellValue(userList.get(j).getDept());
HSSFCell cell14=row.createCell(3);
cell14.setCellValue(userList.get(j).isGender()?"男":"女");
HSSFCell cell15=row.createCell(4);
cell15.setCellValue(userList.get(j).getEmail());
}
}
//5、輸出
workbook.write(outputStream);
workbook.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 建立單元格樣式
* @param workbook 工作簿
* @param fontSize 字型大小
* @return 單元格樣式
* */
private static HSSFCellStyle creatCellStyle(HSSFWorkbook workbook,short fontSize) {
HSSFCellStyle style=workbook.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水準居中
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
//建立字型
HSSFFont font=workbook.createFont();
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//加粗字型
font.setFontHeightInPoints(fontSize);
//加載字型
style.setFont(font);
return style;
}
}
然後修改Service:
@Override
public void exportExcel(List<User> userList,
ServletOutputStream outputStream) {
ExcelUtil.exportExcel(userList, outputStream);
}
再次測試沒有問題,我們方法抽出成功。
使用者清單導出完成,下一次我們來探讨導入功能。
轉載請注明出處:http://blog.csdn.net/acmman/article/details/49382979