JavaWeb 實現Excel 的匯入匯出
阿新 • • 發佈:2019-02-11
開發環境:
myeclipse10.4
/**
匯出Excel 檔案
*/
public String exportDictEntryData(DictionaryManagedForm fm,
HttpServletRequest request, HttpServletResponse response) {
String tempFile;
// 匯出為Excel資料
try {
//查詢資料已經存在的資料
List<DictionaryManagedDomain> dictDomainList = new ArrayList<DictionaryManagedDomain>();
//賦值條件
fm.getDomain().setDictionariesId(fm.getDomain().getId());
dictDomainList = dictionaryManagedDao.getExportDictEntryList(fm.getDomain());
//如果未查詢都資料,直接返回
if(dictDomainList.size()==0){
return "";
}
// 第一步,建立一個webbook,對應一個Excel檔案
HSSFWorkbook wb = new HSSFWorkbook();
// 第二步,並設定excel樣式
HSSFCellStyle titleStyle = wb.createCellStyle();//表頭樣式
titleStyle.setWrapText(true);//自動換行
titleStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
titleStyle.setBorderLeft (HSSFCellStyle.BORDER_THIN);//左邊框
titleStyle.setRightBorderColor(HSSFColor.BLACK.index);//邊框顏色
titleStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上邊框
titleStyle.setRightBorderColor(HSSFColor.BLACK.index);
titleStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右邊框
titleStyle.setRightBorderColor(HSSFColor.BLACK.index);
titleStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);//下邊框
titleStyle.setBottomBorderColor(HSSFColor.BLACK.index);
HSSFCellStyle titleStyle1 = wb.createCellStyle();//大表頭的樣式1
titleStyle1.setWrapText(true);//自動換行
titleStyle1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
titleStyle1.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
HSSFCellStyle titleStyle2 = wb.createCellStyle();//大表頭的樣式2
titleStyle2.setWrapText(true);//自動換行
titleStyle2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
titleStyle2.setAlignment(HSSFCellStyle.ALIGN_LEFT);//水平居左
HSSFCellStyle contentStyle = wb.createCellStyle();//資料樣式
contentStyle.setWrapText(true); //自動換行
contentStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
contentStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居左
contentStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左邊框
contentStyle.setRightBorderColor(HSSFColor.BLACK.index);//邊框顏色
contentStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上邊框
contentStyle.setRightBorderColor(HSSFColor.BLACK.index);
contentStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右邊框
contentStyle.setRightBorderColor(HSSFColor.BLACK.index);
contentStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);//下邊框
contentStyle.setBottomBorderColor(HSSFColor.BLACK.index);
HSSFFont titleFont = wb.createFont();//表頭字型樣式
titleFont.setFontName("宋體");
titleFont.setFontHeightInPoints((short) 11);//設定字型大小
titleFont.setBoldweight((short)800);
HSSFFont contentFont = wb.createFont();//資料字型樣式
contentFont.setFontName("宋體");
contentFont.setFontHeightInPoints((short) 9);//設定字型大小
HSSFFont titleFont1 = wb.createFont();//表頭字型樣式
titleFont1.setFontName("宋體");
titleFont1.setFontHeightInPoints((short) 11);//設定字型大小
titleFont1.setBoldweight((short)800);
titleStyle.setFont(titleFont);
titleStyle1.setFont(titleFont1);//大表頭的樣式
titleStyle2.setFont(titleFont1);//大表頭的樣式
contentStyle.setFont(contentFont);
//TODO:模板下載
HSSFSheet tableSheet;
tableSheet=wb.createSheet("字典項資料");
//設定每列寬度
tableSheet.autoSizeColumn((short) 0, true);
tableSheet.setColumnWidth((short) 0, 20 * 256);
tableSheet.autoSizeColumn((short) 1, true);
tableSheet.setColumnWidth((short) 1, 40 * 256);
tableSheet.autoSizeColumn((short) 2, true);
tableSheet.setColumnWidth((short) 2, 20 * 256);
tableSheet.autoSizeColumn((short) 3, true);
tableSheet.setColumnWidth((short) 3, 20 * 256);
//第四步:將資料放入相應的單元格
HSSFRow targetTableRow ;
HSSFCell targetTableCell;
//資料行 建立第0行
int targetTableI=0;//execl行數
//建立表頭行
targetTableRow = tableSheet.createRow((int) (targetTableI));
targetTableCell = targetTableRow.createCell((short) 0);
targetTableCell.setCellValue("字典項編碼");
targetTableCell.setCellStyle(titleStyle);
targetTableCell = targetTableRow.createCell((short) 1);
targetTableCell.setCellValue("字典項名稱");
targetTableCell.setCellStyle(titleStyle);
//動態插入資料
for (int i = 0; i <dictDomainList.size(); i++) {
targetTableRow = tableSheet.createRow((int) i + 1);
DictionaryManagedDomain dictDomain = new DictionaryManagedDomain();
dictDomain = dictDomainList.get(i);
// 第四步,建立單元格,並設定值
targetTableRow.createCell((short) 0).setCellValue(dictDomain.getDictionariesEntryCode());
targetTableRow.createCell((short) 1).setCellValue(dictDomain.getDictionariesEntryName());
}
try{
long times=System.currentTimeMillis();//為了防止多人同時操作匯出,所以生成時間的臨時檔案
tempFile="C://"+times+".xls";//臨時路徑
FileOutputStream fout = new FileOutputStream(tempFile);
wb.write(fout);
fout.close();
System.out.println("ok..");
return tempFile;
}catch (Exception e){
System.out.println("匯出資料出錯");
e.printStackTrace();
return "";
}
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return "";
}
//匯入Excel
/**
* 匯入新增的表格資料
*/
@Override
public JSONObject importDictEntryForAdd(DictionaryManagedForm fm) {
JSONObject importJson = new JSONObject();
List<DictionaryManagedDomain> errorList = new ArrayList<DictionaryManagedDomain>();//存放錯誤資訊的列表
String flag="0";
//獲取檔案路徑,建立寫入流
InputStream in = null;
try {
in =fm.getExcelImportFile().getInputStream();
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
//匯入的檔案
try{
Workbook wk = Workbook.getWorkbook(in);//定義工作空間
Sheet[] a=wk.getSheets();
Sheet sh = a[0];//定義工作簿
int toRowNum = sh.getRows();//行數
Cell dictCodeCell=null;//第一列
Cell dictNameCell=null;//第二列
DictionaryManagedDomain domain;
List<String> dictEntryCodes=new ArrayList<String>();//用來判斷重複的字典項編碼
List<DictionaryManagedDomain> list= new ArrayList<DictionaryManagedDomain>();
for(int i = 1 ; i < toRowNum ; i ++){//分行,批行匯入
domain = new DictionaryManagedDomain();
dictCodeCell = sh.getCell(0, i);
dictNameCell = sh.getCell(1, i);
String dictEntryCode=dictCodeCell.getContents();//代表字典編碼
String dictEntryName=dictNameCell.getContents();//代表字典項名稱
if(dictEntryCode.trim() != null && !dictEntryCode.trim().equals("")){
if(dictEntryCodes.contains(dictEntryCode.trim())){//疾病編碼重複
domain.setErrors("execl的第"+(i+1)+"行,字典項編碼:"+dictEntryCode.trim()+",字典項名稱:"+dictEntryName.trim()+",重複匯入!");
errorList.add(domain);
} else {
domain.setDictionariesEntryCode(dictEntryCode);
domain.setDictionariesEntryName(dictEntryName);
domain.setId(fm.getDomain().getId());
list.add(domain);
}
}else {
//如果字典為空
domain.setErrors("execl的第"+(i+1)+"行,字典編碼不能為空!");
errorList.add(domain);
}
}
//進入資料插入
if(list.size()==0){
//匯入的excel為空
flag="-2";//匯入excel無有效資料
}else if(list.size()>0){
//匯入表格資料
// int sumNum = dictionaryManagedDao.importDictEntryInfoFromExcel(list);
flag = String.valueOf(list.size());
}
importJson.put("excelData", list);
}catch(Exception e){
e.printStackTrace();
flag="0";
}
importJson.put("flag", flag);//匯入資料行數
importJson.put("errorList", errorList);//匯入資料行數
return importJson;
}
參考文件:
針對不同 POI 通用匯出Excel(.xls,.xlsx) http://blog.csdn.net/houxuehan/article/details/50960259