1. 程式人生 > >ajax(FormData)的poi下載excel模板與excel上傳解析(maven專案與非maven專案)(poi-ooxml與poi3.9

ajax(FormData)的poi下載excel模板與excel上傳解析(maven專案與非maven專案)(poi-ooxml與poi3.9

自己專案中遇到了,寫了挺久的,花了挺多時間的來找相關資料,這次來份詳細的上傳,包括poi-ooxml(maven專案)

下載都一樣沒有區別

excel 下載模板,其實預設內容  (這個下載沒寫好,使用者無法選定儲存路徑) :

前臺不寫了就是一個普通的請求

@RequestMapping(value = "downloadTemp", method = RequestMethod.POST)
public void downloadTemp(HttpServletResponse response) {
    response.setContentType("application/x-download"
); response.setHeader("Pragma", "public"); response.setHeader("Cache-Control", "max-age=0"); response.setHeader("Content-Disposition", "attachment; filename=Temp.xlsx");//以上都是設定響應,以下是設定模板 Workbook wb; Row row; Cell cell; Sheet sheet; try { wb = new XSSFWorkbook(); sheet = wb.createSheet();
row = sheet.createRow(0);cell = row.createCell(0); cell.setCellValue("訂單號"); cell = row.createCell(1); cell.setCellValue("物流單號"); sheet.autoSizeColumn(1, true); wb.write(response.getOutputStream());//響應 LOG.info("下載發貨excel模板成功"); } catch (Exception e) { LOG.error("下載發貨excel模板出錯", e); }

之前做過普通專案的下載,現在做的是ajax的maven專案

上傳poi-ooxml :   (以下程式碼做過一些修改,刪除了與我專案有關的操作都很簡單的)

前臺:

html:

<form class="hidden" id="uploadTemp" method="post" enctype="multipart/form-data">
    <input id="uploadTemp_data" name="uploadFile" type="file" class="hidden">
//這裡還可以在攜帶其他的表單引數
</form>
js(ajax):
var $uploadTemp_input = $("#uploadTemp_data"); 
//判斷選擇檔案是否已選擇
var file = $uploadTemp_input.get(0).files[0];/獲取到選擇的檔案
if (!file || file == '') {
    butil.alert("操作失敗", "還未選擇檔案", "error");
console.log("檔案型別錯誤");
return;
}
//判斷選擇檔案型別
var fileName = file.name;
var index = fileName.lastIndexOf('.');
var fix = fileName.substring(index + 1);
if ((fix != "xls" && fix != "xlsx")) {
    butil.alert("操作失敗", "檔案型別選擇錯誤", "error");
console.log("檔案型別錯誤");
return;
}var formData = new FormData($("#uploadTemp").get(0));//獲取到form表單然後ajax傳送請求
window.setTimeout(function () {
                $.ajax({
                    url: $rootScope.serverUrls.orderUrl + "/order/uploadTemp",
type: 'post',
data: formData,
async: false,
cache: false,
contentType: false,
processData: false,
success: function (record) {
 console.info(record);
},
error: function (data) {
console.info(data);
}
                });
}, 100);
}
    }
});


後臺伺服器(ajax的)

@RequestMapping(value = "uploadTemp", method = RequestMethod.POST)
@ResponseBody
public OrderSeedRecord uploadTemp(HttpServletRequest request, MultipartFile uploadFile) {
       if (request.getContentType().indexOf("multipart/form-data") >= 0) {
        InputStream in = null;
        try {
            in = uploadFile.getInputStream();
Workbook workbook = WorkbookFactory.create(in);
Sheet sheet = workbook.getSheetAt(0);   //暫時只做第一個sheet的讀取
int lastNum = sheet.getLastRowNum();    //最後一行的index
Row row;            for (int i = 1; i <= lastNum; i++) {        //從excel取資料
row = sheet.getRow(i);

                    String orderNo = ExcelPoiFormat.getCellValue(row.getCell(0));  //第一列
String logisticsNo = ExcelPoiFormat.getCellValue(row.getCell(1));//第二列

                }
}
LOG.info("excel轉換資料完成:{}");
} catch (Exception e) {
            LOG.error("excel轉換成資料,發生錯誤", e);
} finally {
            if (in != null) {
                try {
                    in.close();
} catch (IOException e) {
                    LOG.error("關閉流發生錯誤", e);
}
            }
        }
    }
    return record;
}

後臺解析時,格式問題:

public class ExcelPoiFormat {

   private static DecimalFormat df = new DecimalFormat("0");
    public static String getCellValue(Cell cell) {

        String value = "";
        if (cell != null) {
            int cellType = cell.getCellType();
            switch (cellType) {
                case 0:            //表示數值
value =  df.format(cell.getNumericCellValue());
                    break;
                case 1:            //表示字串
value = cell.getStringCellValue();
                    break;
                case 3:            //表示空白
value = "";
                    break;
                case 4:            //表示boolean
value = cell.getBooleanCellValue() + "";
                    break;
                case 5:            //表示錯誤
                   // value = cell.getErrorCellValue() + "";
value = ""; //用空串
break;
                default:        //表示其他
value = "";
                    break;
}
        } else {
            value = "";
}
        return value.trim();
}
}

poi3.9的 這個做不是ajax的

前臺就是一個表單提交

@RequestMapping("/addServiceAccountMany")
public String insertServiceAccountMany(HttpServletRequest request,
@RequestParam("upLoadFile") CommonsMultipartFile upLoadFile) {
List<ServiceAccountBean> list = new ArrayList<ServiceAccountBean>();

int j = 1;


// 檔案輸入流
InputStream fis = null;


// 取得客戶端上傳的資料型別
String contentType = request.getContentType();


// 第幾個sheet
int number = 1;


// 判斷內容型別
if (contentType.indexOf("multipart/form-data") >= 0) {
try {


fis = upLoadFile.getFileItem().getInputStream(); // 獲得請求來的流


Workbook book = WorkbookFactory.create(fis);// 通過流獲得WorkBook


Sheet sheet = book.getSheetAt(number - 1);// 獲得Sheet,起始位置為0


int lastRowNum = sheet.getLastRowNum(); // _execl表格中的最後一行


Row row = null;
for (int i = 1; i <= lastRowNum; i++) {
row = sheet.getRow(i);// 獲得每一行,通過迴圈變成一個一個的物件,最後放入集合中
if (row != null) {
//這裡與上面操作一樣的,無非就是取第幾行第幾列的值

}


}
}
} catch (IOException e1) {
e1.printStackTrace();
} catch (InvalidFormatException e) {
e.printStackTrace();
}
}

return "xxxxx";
}