1. 程式人生 > >JavaWeb 實現Excel 的匯入匯出

JavaWeb 實現Excel 的匯入匯出

開發環境:
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