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";
}