java深入-maven项目之POI

本文介绍了Apache POI的基本概念,包括HSSF、XSSF、HWPF和XWPF用于处理不同版本的Microsoft Office文件。重点讨论了在Java中使用POI进行Excel文件的导入和导出,强调了版本选择、特殊字符处理和类型转换问题,特别是Integer和Date在导入导出时可能出现的问题,并给出了避免空行和格式化时间的解决建议。
部署运行你感兴趣的模型镜像

POI基本了解

Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

  • HSSF提供读写XLS格式档案的功能。
  • XSSF提供读写XLSX格式档案的功能。
  • HWPF提供读写DOC格式档案的功能。
  • XWPF提供读写DOCX格式档案的功能。

-----------------------------------------------------------------------------

工作簿 workbook
工作表 sheet
行 row
单元格 cell

jar包

<!-- POI支持 -->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>3.15</version>
		</dependency>
//适用于低版本,也就是xls结尾的Excel表格

<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>3.17</version>
		</dependency>
//适用于高版本,也就是xlsx结尾的Excel表格

//pom文件中只能导入上面两个jar包其中一个,否则会导致jar包版本冲突
//或者可以去官网下载jar包

操作Excel文件区分版本:
2003版本(包含2003)以前的扩展名为.xls需要用HSSFWorkbook类操作
2007版本(包含2007)以后的扩展名为.xlsx需要用XSSFWorkbook类操作

POI导入

//导入excel
	@RequestMapping("/importExcel")
	public void importExcel(MultipartFile files){
		//获取文件
		try {
			HSSFWorkbook workbook = new HSSFWorkbook(files.getInputStream());
			//获取工作表
			HSSFSheet sheet = workbook.getSheetAt(0);
			//获取到总行数
			int lastRowNum = sheet.getLastRowNum();
			//遍历
			for(int i=0;i<=lastRowNum;i++){
				//获取到每一行的数据
				HSSFRow row = sheet.getRow(i);
				//获取每一行内容
				String  ename = row.getCell(0).getStringCellValue();
				String address = row.getCell(1).getStringCellValue();
				Emp emp = new Emp();
				String sex = row.getCell(2).getStringCellValue();
				Date date = row.getCell(3).getDateCellValue();
				if (sex.equals("男")) {
					emp.setSex("0");
				}else{
					emp.setSex("1");
				}
				SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
				emp.setHiredate(simpleDateFormat.format(date));//2012-12-12
				
				emp.setEname(ename);
				emp.setAddress(address);
				empService.saveEmp(emp);
			}
				
		} catch (Exception e) {
			e.printStackTrace();
			logger.error("导入Excel错误",e);
		}
		//使用poi进行遍历
		//遍历excel里的数据
		//写入到mysql数据库
	}

POI导出

//前端提交方式跟上传一样

//导出员工表里所有的数据
	@RequestMapping("/exportExcel")
	public void exportExcel(HttpServletRequest request,HttpServletResponse response){
		HSSFWorkbook  workbook = new HSSFWorkbook();
		try {
			//创建sheet
			HSSFSheet sheet = workbook.createSheet();
			//定义头标题
			String title[] = {"姓名","住址","年龄","性别"}; 
			//先创建标题
			HSSFRow titleRow = sheet.createRow(0);
			for(int i=0;i<title.length;i++){
				titleRow.createCell(i).setCellValue(title[i]);
			}
			//查询数据库
			List<Emp> list = empService.findAll();
			for(int i=0;i<list.size();i++){
				HSSFRow row = sheet.createRow(i+1);
				row.createCell(0).setCellValue(list.get(i).getEname());
				row.createCell(1).setCellValue(list.get(i).getAddress());
				row.createCell(2).setCellValue(list.get(i).getAge());
				if("0".equals(list.get(i).getSex())){
				   row.createCell(3).setCellValue("男");
				}else{
				   row.createCell(3).setCellValue("女");
				}
				
			}
			response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode("员工列表.xls", "UTF-8"));
			response.setHeader("Connection", "close");
			response.setHeader("Content-Type", "application/octet-stream");
	        workbook.write(response.getOutputStream());
			workbook.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

问题总结:

导入或者导出使用Excel表格时,一定要注意Excel版本问题。

特殊字符处理

public class Demo14 {
   //遍历单元格中内容
	public static void main(String[] args) throws Exception {
		Workbook workbook = new HSSFWorkbook();
		Sheet  sheet = workbook.createSheet("就业数据");
		CellStyle style;
		DataFormat  format = workbook.createDataFormat();
		Row row;
		Cell cell;
		short rowNum =0;
		short cellNum=0;
		row = sheet.createRow(rowNum++);
		cell = row.createCell(cellNum);
		cell.setCellValue(123213.25);
		style = workbook.createCellStyle();
		style.setDataFormat(format.getFormat("0.0"));//设置数据格式
		cell.setCellStyle(style);
		row = sheet.createRow(rowNum++);
		cell = row.createCell(cellNum);
		cell.setCellValue(3453464565.25);
		style = workbook.createCellStyle();
		style.setDataFormat(format.getFormat("#,##0.000"));//设置数据格式
		cell.setCellStyle(style);
		
		FileOutputStream fileOutputStream = new FileOutputStream("D:\\demo14.xls");
		workbook.write(fileOutputStream);
		fileOutputStream.close();	
	}	
}

类型转换问题

Integer,Date在进行导入导出时,有可能会出现内容不一致问题,比如:

  • 如有判断条件时,防止有空行时,在 if 判断语句内get一个 lastRowNum 即可
  • 时间格式导出时可能会被转换为数字,这时需要格式化一下时间
//导出
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

cell = row.createCell(1);
cell.setCellValue(sdf.format(list.get(i).getEmpBirth()));

//导出
emp.setEmpBirth(sdg.parse(row.getCell(1).getStringCellValue()));

poi设置字体颜色、字体大小
在日常开发中一般不会用到,有兴趣可以试一下

   HSSFRichTextString richString = new HSSFRichTextString(textValue); //textValue是要设置大小的单元格数据
                HSSFFont font = workbook.createFont();
                font.setColor(HSSFColor.BLACK.index);//设置excel数据字体颜色
                font.setFontHeightInPoints((short) 11);//设置excel数据字体大小
                richString.applyFont(font);
                cell.setCellValue(richString);

有新的内容时后期会补充…

您可能感兴趣的与本文相关的镜像

Yolo-v8.3

Yolo-v8.3

Yolo

YOLO(You Only Look Once)是一种流行的物体检测和图像分割模型,由华盛顿大学的Joseph Redmon 和Ali Farhadi 开发。 YOLO 于2015 年推出,因其高速和高精度而广受欢迎

通常业务需求都是客户端一个导出按钮,发送请求到服务端,服务端写一个接口导出报表到客户端,客户可以自行下载。无论Struts或者springMVC均可。 @RequestMapping("Export") @ResponseBody public String getAll(HttpServletRequest request,HttpServletResponse response) throws IOException{ //集合为需要导出数据,数据查询得到,这里测试就不写了。 List<User> list=new ArrayList<User>(); // 生成Excel文件 HSSFWorkbook hssfWorkbook = new HSSFWorkbook(); HSSFSheet sheet = hssfWorkbook.createSheet("测试数据"); // 表头 HSSFRow headRow = sheet.createRow(0); headRow.createCell(0).setCellValue("姓名"); headRow.createCell(1).setCellValue("手机号码"); headRow.createCell(2).setCellValue("年龄"); // 表格数据 for (User user : list) { HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1); dataRow.createCell(0).setCellValue(user.getName()); dataRow.createCell(1).setCellValue(user.getPhone()); dataRow.createCell(2).setCellValue(user.getAge()); } // 下载导出(一个流两个头) // 设置头信息 response.setContentType( "application/vnd.ms-excel"); // MIME .jpg .xls .mp3 .avi .txt .exe String filename = "驾驶员数据.xls"; //如果为Struts框架,获得request和response可用ServletActionContext String agent = request .getHeader("user-agent"); filename = FileUtils.encodeDownloadFilename(filename, agent); response.setHeader("Content-Disposition", "attachment;filename=" + filename); ServletOutputStream outputStream = response .getOutputStream(); //输出 hssfWorkbook.write(outputStream); // 关闭 hssfWorkbook.close(); //System.out.println("导出成功"); return "success"; }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值