Servlet+poi读写excel

poi导入excel数据

依赖如下:
在这里插入图片描述

private void importData(HttpServletRequest req, HttpServletResponse resp){
	    String iYear    = "";//假设前面传了两个参数,第一个参数是年
		String iQuarter = "";//第二个参数是季度
		List<FileItem> 	items;
		try {
			items = importFile(req, resp);
			for (FileItem item : items) {
				String name 	= "";
				String value 	= "";
				if (item.isFormField()) {
					name = item.getFieldName();
					value = item.getString("utf-8");
					if (name.equals("importYear"))  //获取参数一
						iYear = value;
					if (name.equals("importQuarter")) //获取参数二
						iQuarter = value;
				}
			}
			for (FileItem item : items) {
				if (!item.isFormField()) {
					InputStream in = item.getInputStream();
					//读取原始数据
					List<Object> objectList = readXls( in,iYear,iQuarter );
					in.close();
					//对原始数据做处理
					
				}
			}
		} catch (ServletException e) {e.printStackTrace();} 
		catch (IOException e) {e.printStackTrace();}
	}
	
	public List<Object> readXls(InputStream path,String pYear,String pQuarter)
			throws IOException {
		List<Object> ObjectList = new ArrayList<Object>();
		Object 		iObject 	= null;
		HSSFWorkbook hssfWorkbook = new HSSFWorkbook(path);
		// 循环工作表Sheet
		for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
			HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
			if (hssfSheet == null) {
				continue;
			}
			// 循环行Row
			for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
				HSSFRow hssfRow = hssfSheet.getRow(rowNum);
				if (hssfRow != null) {
					if ( numSheet == 0 ) { //获取第一个sheet信息 
						System.out.println(getCellValue(hssfRow.getCell(0)) +","+getCellValue(hssfRow.getCell(1)) +","+getCellValue(hssfRow.getCell(3)) +","+getCellValue(hssfRow.getCell(4)));
						//一般我会将信息存到一个Object里面
					}else if ( numSheet == 1 ) { //获取第二个sheet信息 
						//将信息存到一个Object里面
					}else{
					}
					//对象放入集合
					ObjectList.add(iObject);
				}
			}
		}
		return ObjectList;
	}
	
	private String getCellValue(Cell cell) {
		String cellvalue = "";
		if (cell != null) {
			// 判断当前Cell的Type
			switch (cell.getCellType()) {
			// 如果当前Cell的Type为NUMERIC
			case HSSFCell.CELL_TYPE_NUMERIC: {
				short format = cell.getCellStyle().getDataFormat();
				if (format == 14 || format == 31 || format == 57
						|| format == 58) { // excel中的时间格式
					SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
					double value = cell.getNumericCellValue();
					Date date = DateUtil.getJavaDate(value);
					cellvalue = sdf.format(date);
				}
				// 判断当前的cell是否为日期类型
				else if (HSSFDateUtil.isCellDateFormatted(cell)) { 
				  	// 经测试发现HSSFDateUtil.isCellDateFormatted(cell)只识别2022/02/02这种格式。
					// 如果是日期类型,获取该Cell的Date值 (对2022-02-02格式识别不出是日期格式)
					Date date = cell.getDateCellValue();
					DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
					cellvalue = formater.format(date);
				} else { // 纯数字
					// 获取当前Cell的数值
					cellvalue = NumberToTextConverter.toText(cell.getNumericCellValue());
				}
				break;
			}
			// 如果当前Cell的Type为string
			case HSSFCell.CELL_TYPE_STRING:
				// 取得当前的Cell字符串
				cellvalue = cell.getStringCellValue().replaceAll("'", "''");
				break;
			case HSSFCell.CELL_TYPE_BLANK:
				cellvalue = null;
				break;
			// 默认的Cell值
			default: {
				cellvalue = " ";
			}
			}
		} else {
			cellvalue = "";
		}
		return cellvalue;
	}
	public static List<FileItem> importFile(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		String iRst = "";
		List<FileItem> items = null;
		// 1、创建一个DiskFileItemFactory工厂
		DiskFileItemFactory factory = new DiskFileItemFactory();
		// 2、创建一个文件上传解析器
		ServletFileUpload upload = new ServletFileUpload(factory);
		// 解决上传文件名的中文乱码
		upload.setHeaderEncoding("UTF-8");
		factory.setSizeThreshold(1024 * 500);// 设置内存的临界值为500K
		upload.setSizeMax(1024 * 1024 * 500);// 设置上传的文件总的大小不能超过500M

		try {
			// 1. 得到 FileItem 的集合 items
			items = upload.parseRequest(request);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return items;
	}

POI导出excel

private void exportData(HttpServletResponse resp){
		String iFileName = "XXX模板";
		try {
			OutputStream out = resp.getOutputStream();
			resp.reset();
			resp.setHeader(
					"content-disposition",
					"attachment;filename="
							+ java.net.URLEncoder.encode(iFileName,
									"UTF-8") + ".xls");
			resp.setContentType("application/msexcel");
			List<List<String>> data = new ArrayList<List<String>>();
			
			String[] header0 = { "姓名"   , "角色"   , "权重"  ,"说明" ,"排序"};
			String[] header1 = { "部门类型", "部门名称", "领导","说明" ,"部门排序"};
			String[] header2 = { "部门名称", "人员名称", "职位", "说明", "特殊处理" , "人员排序"};
			ExportExcelUtils eeu = new ExportExcelUtils();
			HSSFWorkbook workbook = new HSSFWorkbook();
			eeu.exportExcel(workbook, 0, "Sheet_1名称", header0, data, out);
			eeu.exportExcel(workbook, 1, "Sheet_2名称", header1, data, out);
			eeu.exportExcel(workbook, 2, "Sheet_3名称", header2, data, out);
			// 原理就是将所有的数据一起写入,然后再关闭输入流。
			workbook.write(out);
			out.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

ExportExcelUtils.exportExcel方法内容如下:

public void exportExcel(HSSFWorkbook workbook, int sheetNum,
			String sheetTitle, String[] headers, List<List<String>> result,
			OutputStream out) throws Exception {
		// 生成一个表格
		HSSFSheet sheet = workbook.createSheet();
		workbook.setSheetName(sheetNum, sheetTitle);
		// 设置表格默认列宽度为20个字节
		sheet.setDefaultColumnWidth((short) 20);
		// 生成一个样式
		HSSFCellStyle style = workbook.createCellStyle();
		// 设置这些样式
		style.setFillForegroundColor(HSSFColor.PALE_BLUE.index);
		style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
		style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
		style.setBorderRight(HSSFCellStyle.BORDER_THIN);
		style.setBorderTop(HSSFCellStyle.BORDER_THIN);
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		// 生成一个字体
		HSSFFont font = workbook.createFont();
		font.setFontName("宋体");
		font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		// 把字体应用到当前的样式
		style.setFont(font);
 
		// 指定当单元格内容显示不下时自动换行
		style.setWrapText(true);
 
		// 产生表格标题行
		HSSFRow row = sheet.createRow(0);
		for (int i = 0; i < headers.length; i++) {
			HSSFCell cell = row.createCell((short) i);
		
			cell.setCellStyle(style);
			HSSFRichTextString text = new HSSFRichTextString(headers[i]);
			cell.setCellValue(text.toString());
		}
		// 遍历集合数据,产生数据行
		if (result != null) {
			int index = 1;
			for (List<String> m : result) {
				row = sheet.createRow(index);
				int cellIndex = 0;
				for (String str : m) {
					HSSFCell cell = row.createCell((short) cellIndex);
					cell.setCellValue(str.toString());
					cellIndex++;
				}
				index++;
			}
		}
	}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值