最早開始的時候做過一些數據Excel導出的功能,但是到後期每一次導出都需要寫一些差不多類似的代碼,稍微研究了一下寫了個公共的導出方法。
這裏用的是POI,然後寫成了一個公共類,傳入設置好格式的數據,就能彈出下載框。
- package com.hwt.glmf.common;
- import java.io.IOException;
- import java.io.OutputStream;
- import java.util.ArrayList;
- import java.util.List;
- import javax.servlet.http.HttpServletResponse;
- 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.HSSFRichTextString;
- 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 org.apache.poi.hssf.util.HSSFColor;
- /**
- * 導出Excel公共方法
- * @version 1.0
- *
- * @author wangcp
- *
- */
- public class ExportExcel extends BaseAction {
- //顯示的導出表的標題
- private String title;
- //導出表的列名
- private String[] rowName ;
- private List<Object[]> dataList = new ArrayList<Object[]>();
- HttpServletResponse response;
- //構造方法,傳入要導出的數據
- public ExportExcel(String title,String[] rowName,List<Object[]> dataList){
- this.dataList = dataList;
- this.rowName = rowName;
- this.title = title;
- }
- /*
- * 導出數據
- * */
- public void export() throws Exception{
- try{
- HSSFWorkbook workbook = new HSSFWorkbook(); // 創建工作簿對象
- HSSFSheet sheet = workbook.createSheet(title); // 創建工作表
- // 產生表格標題行
- HSSFRow rowm = sheet.createRow(0);
- HSSFCell cellTiltle = rowm.createCell(0);
- //sheet樣式定義【getColumnTopStyle()/getStyle()均爲自定義方法 - 在下面 - 可擴展】
- HSSFCellStyle columnTopStyle = this.getColumnTopStyle(workbook);//獲取列頭樣式對象
- HSSFCellStyle style = this.getStyle(workbook); //單元格樣式對象
- sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, (rowName.length-1)));
- cellTiltle.setCellStyle(columnTopStyle);
- cellTiltle.setCellValue(title);
- // 定義所需列數
- int columnNum = rowName.length;
- HSSFRow rowRowName = sheet.createRow(2); // 在索引2的位置創建行(最頂端的行開始的第二行)
- // 將列頭設置到sheet的單元格中
- for(int n=0;n<columnNum;n++){
- HSSFCell cellRowName = rowRowName.createCell(n); //創建列頭對應個數的單元格
- cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING); //設置列頭單元格的數據類型
- HSSFRichTextString text = new HSSFRichTextString(rowName[n]);
- cellRowName.setCellValue(text); //設置列頭單元格的值
- cellRowName.setCellStyle(columnTopStyle); //設置列頭單元格樣式
- }
- //將查詢出的數據設置到sheet對應的單元格中
- for(int i=0;i<dataList.size();i++){
- Object[] obj = dataList.get(i);//遍歷每個對象
- HSSFRow row = sheet.createRow(i+3);//創建所需的行數
- for(int j=0; j<obj.length; j++){
- HSSFCell cell = null; //設置單元格的數據類型
- if(j == 0){
- cell = row.createCell(j,HSSFCell.CELL_TYPE_NUMERIC);
- cell.setCellValue(i+1);
- }else{
- cell = row.createCell(j,HSSFCell.CELL_TYPE_STRING);
- if(!"".equals(obj[j]) && obj[j] != null){
- cell.setCellValue(obj[j].toString()); //設置單元格的值
- }
- }
- cell.setCellStyle(style); //設置單元格樣式
- }
- }
- //讓列寬隨着導出的列長自動適應
- for (int colNum = 0; colNum < columnNum; colNum++) {
- int columnWidth = sheet.getColumnWidth(colNum) / 256;
- for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
- HSSFRow currentRow;
- //當前行未被使用過
- if (sheet.getRow(rowNum) == null) {
- currentRow = sheet.createRow(rowNum);
- } else {
- currentRow = sheet.getRow(rowNum);
- }
- if (currentRow.getCell(colNum) != null) {
- HSSFCell currentCell = currentRow.getCell(colNum);
- if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
- int length = currentCell.getStringCellValue().getBytes().length;
- if (columnWidth < length) {
- columnWidth = length;
- }
- }
- }
- }
- if(colNum == 0){
- sheet.setColumnWidth(colNum, (columnWidth-2) * 256);
- }else{
- sheet.setColumnWidth(colNum, (columnWidth+4) * 256);
- }
- }
- if(workbook !=null){
- try
- {
- String fileName = "Excel-" + String.valueOf(System.currentTimeMillis()).substring(4, 13) + ".xls";
- String headStr = "attachment; filename=\"" + fileName + "\"";
- response = getResponse();
- response.setContentType("APPLICATION/OCTET-STREAM");
- response.setHeader("Content-Disposition", headStr);
- OutputStream out = response.getOutputStream();
- workbook.write(out);
- }
- catch (IOException e)
- {
- e.printStackTrace();
- }
- }
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- /*
- * 列頭單元格樣式
- */
- public HSSFCellStyle getColumnTopStyle(HSSFWorkbook workbook) {
- // 設置字體
- HSSFFont font = workbook.createFont();
- //設置字體大小
- font.setFontHeightInPoints((short)11);
- //字體加粗
- font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
- //設置字體名字
- font.setFontName("Courier New");
- //設置樣式;
- HSSFCellStyle style = workbook.createCellStyle();
- //設置底邊框;
- style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
- //設置底邊框顏色;
- style.setBottomBorderColor(HSSFColor.BLACK.index);
- //設置左邊框;
- style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
- //設置左邊框顏色;
- style.setLeftBorderColor(HSSFColor.BLACK.index);
- //設置右邊框;
- style.setBorderRight(HSSFCellStyle.BORDER_THIN);
- //設置右邊框顏色;
- style.setRightBorderColor(HSSFColor.BLACK.index);
- //設置頂邊框;
- style.setBorderTop(HSSFCellStyle.BORDER_THIN);
- //設置頂邊框顏色;
- style.setTopBorderColor(HSSFColor.BLACK.index);
- //在樣式用應用設置的字體;
- style.setFont(font);
- //設置自動換行;
- style.setWrapText(false);
- //設置水平對齊的樣式爲居中對齊;
- style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
- //設置垂直對齊的樣式爲居中對齊;
- style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
- return style;
- }
- /*
- * 列數據信息單元格樣式
- */
- public HSSFCellStyle getStyle(HSSFWorkbook workbook) {
- // 設置字體
- HSSFFont font = workbook.createFont();
- //設置字體大小
- //font.setFontHeightInPoints((short)10);
- //字體加粗
- //font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
- //設置字體名字
- font.setFontName("Courier New");
- //設置樣式;
- HSSFCellStyle style = workbook.createCellStyle();
- //設置底邊框;
- style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
- //設置底邊框顏色;
- style.setBottomBorderColor(HSSFColor.BLACK.index);
- //設置左邊框;
- style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
- //設置左邊框顏色;
- style.setLeftBorderColor(HSSFColor.BLACK.index);
- //設置右邊框;
- style.setBorderRight(HSSFCellStyle.BORDER_THIN);
- //設置右邊框顏色;
- style.setRightBorderColor(HSSFColor.BLACK.index);
- //設置頂邊框;
- style.setBorderTop(HSSFCellStyle.BORDER_THIN);
- //設置頂邊框顏色;
- style.setTopBorderColor(HSSFColor.BLACK.index);
- //在樣式用應用設置的字體;
- style.setFont(font);
- //設置自動換行;
- style.setWrapText(false);
- //設置水平對齊的樣式爲居中對齊;
- style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
- //設置垂直對齊的樣式爲居中對齊;
- style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
- return style;
- }
- }
- String title = Message.getString("manifestIExportTitle");
- String[] rowsName = new String[]{"序號","貨物運輸批次號","提運單號","狀態","錄入人","錄入時間"};
- List<Object[]> dataList = new ArrayList<Object[]>();
- Object[] objs = null;
- for (int i = 0; i < manifestIMainList.size(); i++) {
- ManifestIMain man = manifestIMainList.get(i);
- objs = new Object[rowsName.length];
- objs[0] = i;
- objs[1] = man.getTranNo();
- objs[2] = man.getBillNo();
- objs[3] = man.getStatusFlagCnName();
- objs[4] = man.getLoginName();
- SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- String date = df.format(man.getModiDate());
- objs[5] = date;
- dataList.add(objs);
- }
- ExportExcel ex = new ExportExcel(title, rowsName, dataList);
- ex.export();
和sheet名。
以以上的數據爲例,導出的結果顯示如下(只是做了簡單的處理,有一些合併行與excel的樣式問題沒有涉及):