java读写Excel模板文件,应用于负载均衡多个服务器
首先,需要大家明白一点,对于多服务器就不能用导出文件用a标签访问链接方式去导出excel文件了,原因相信大家也明白,可能也做过尝试。
现在开始第一步:get请求,productPath 为你的项目路径
var url=productPath + "/CtrlService"+"?action=ZcjqrGlfExport&UserName="+ username+"&FILENAME="+ filePath; window.open(url);
第二步:
public Object doCtrlService(StubObject arg0, JParamObject arg1, HttpServletRequest req, HttpServletResponse resp) throws Exception { String filePath = req.getParameter("FILENAME"); try { JParamObject PO=JParamObject.getInstance(); PO.SetValueByParamName("filePath", filePath); PO.setEnvValue("DBNO", "FMIS_DB01"); PO.setEnvValue("DataBaseName", "FMIS_DB01"); JResponseObject RO=(JResponseObject) EAI.DAL.SVR("FMIS_ZCJQR_GLFFT_EXPORT", PO); String fileName=(String)RO.getResponseObject("fileName"); byte[] fileBytes=(byte[])RO.getResponseObject("fileBytes"); if(fileBytes==null){ return null; } setResponseHeader(resp,fileName,".xls"); ServletOutputStream out=resp.getOutputStream(); try{ out.write(fileBytes); out.close(); }catch(Exception e){ if(e.getClass().getName().equals("org.apache.catalina.connector.ClientAbortException")){ logger.info("客户端终止操作"); return null; } throw e; } } catch (Exception e) { String errMsg = "异常"; logger.error(errMsg,e); ServiceException se = new ServiceException(e.getMessage()); se.setErrorCode(-502); se.setErrorMessage(errMsg); throw se; } return null; } private void onError(HttpServletResponse resp, String msg) throws Exception { resp.setHeader("Content-type", "text/html;charset=UTF-8"); resp.setCharacterEncoding("UTF-8"); resp.getWriter().print(msg); } private void setResponseHeader(HttpServletResponse resp, String fileName, String fileType) throws Exception { String fileNameEncode = java.net.URLEncoder.encode(fileName, "UTF-8"); String[][] contentType = { {".xls","application/x-xls"} }; for (int i = 0; i < contentType.length; i++) { if (contentType[i][0].equals(fileType)) { resp.setContentType(contentType[i][1]); break; } } resp.addHeader("Content-Disposition", "attachment;filename=" + fileNameEncode); return; }
第三步:读取模板文件,并输出文件流
	private byte[]  fileExport(JConnection conn, JParamObject PO) {
		InputStream io;
		String  path=EAI.LocalUserHome;
		String modelfilepath=path+"importTemp"+File.separator+"Glfftmodel.xls";
		String filename=TempleNameUtils.createTempTableName("glfmx_");
		String outputPath=path+"exporttemp"+File.separator+filename+".xls";
		ByteArrayOutputStream outputStream = null;
		byte[] bytes = new byte[0];
		deleteExcelBeforeExport(path+"exporttemp","glfmx");
		try{
		//这里读出来的workbook作为模版
		io = new FileInputStream(new File(modelfilepath));
		HSSFWorkbook workbook = new HSSFWorkbook(io);
		HSSFSheet sheet=workbook.getSheetAt(0);
		List<Glfftbean> listg=QueryGlfftList(conn);
		HSSFCellStyle cellStyle = workbook.createCellStyle(); // 单元格样式
		cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
		cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
		cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
		cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
		 
		for(int i=0;i<listg.size();i++){
			Glfftbean glfftbean=listg.get(i);
			System.out.println(i);
			String xmbh= glfftbean.getXmbh();
			HSSFRow row=sheet.getRow(i+9);//第10行开始
			if (row == null) {
				row = sheet.createRow(i+9);
				row.createCell(0).setCellValue(xmbh);
				row.createCell(1).setCellValue(glfftbean.getXmmc());
				row.createCell(2).setCellValue(glfftbean.getQmzjgc());
				row.createCell(3).setCellValue(glfftbean.getZcbh());
				row.createCell(4).setCellValue(glfftbean.getZcmc());
				row.createCell(5).setCellValue(glfftbean.getCbzxbh());
				row.createCell(6).setCellValue(glfftbean.getCbzxmc());
				row.createCell(7).setCellValue(glfftbean.getFtje());
				row.createCell(8).setCellValue(glfftbean.getQzfzcbh());
			}else{
				row.getCell(0).setCellValue(xmbh);
				row.getCell(1).setCellValue(glfftbean.getXmmc());
				row.getCell(2).setCellValue(glfftbean.getQmzjgc());
				row.getCell(3).setCellValue(glfftbean.getZcbh());
				row.getCell(4).setCellValue(glfftbean.getZcmc());
				row.getCell(5).setCellValue(glfftbean.getCbzxbh());
				row.getCell(6).setCellValue(glfftbean.getCbzxmc());
				row.getCell(7).setCellValue(glfftbean.getFtje());
				row.getCell(8).setCellValue(glfftbean.getQzfzcbh());
			}
			for (Cell cell : row) {
				 cell.setCellStyle(cellStyle);
				}
			
		}
			File file= new File(outputPath);
			FileOutputStream fo=new FileOutputStream(file);
			workbook.write(fo);
			workbook.close();
			long fileSize = file.length();
			FileInputStream in = new FileInputStream(file);
			byte[] buffer = new byte[(int) fileSize];
			while ((fileSize = in.read(buffer)) != -1) {
				return buffer;
			}
			in.close();
			return buffer;
		}catch (Exception e){
			String errMsg = "创建文件流失败";
			logger.error(errMsg, e);
			ServiceException se = new ServiceException(e.getMessage());
			se.setErrorCode(-1);
			se.setErrorMessage(errMsg);
		}
		return bytes;
	}
删除相关文件:
public static void deleteExcelBeforeExport(String path, String username) { File file = new File(path); File[] fileList = file.listFiles(); if (fileList != null) { for (int i = 0; i < fileList.length; i++) { File fs = fileList[i]; if (!fs.isDirectory()) { String[] fileNames = fs.getName().split("_"); if (fileNames.length > 1) { String fileUserName = fileNames[0]; // --删除包含该用户名的并且后缀的开头为 if (fileUserName.equals(username)) { String deleteFilePath = path + File.separator + fs.getName(); File deleteFile = new File(deleteFilePath); deleteFile.delete(); } } } } } }
结束
思路总结:需要生成文件 ->读取文件 -> 输出文件流 -> 删除文件
属作者原创,如有转载,请表明出处:https://www.cnblogs.com/mobeisanghai/p/12191374.html
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号