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);
有新的内容时后期会补充…
本文介绍了Apache POI的基本概念,包括HSSF、XSSF、HWPF和XWPF用于处理不同版本的Microsoft Office文件。重点讨论了在Java中使用POI进行Excel文件的导入和导出,强调了版本选择、特殊字符处理和类型转换问题,特别是Integer和Date在导入导出时可能出现的问题,并给出了避免空行和格式化时间的解决建议。
4219

被折叠的 条评论
为什么被折叠?



