使用Apach的PIO
通过网上查到Apach PIO提供了以下几种方法:
HSSF - 读写XLS格式档案(Excel2003)。
XSSF - 读写OOXML XLSX格式档案(Excel2007+)。
HWPF - 读写Word-DOC97格式档案。
XWPF - 读写Word-DOC2003格式档案。
HSLF - 读写PowerPoint格式档案。
HDGF - 读visio格式档案。
HPBF - 读ublisher格式档案。
HSMF - 读Ooutlook格式档案
先来看看xlsx格式的文档导出导入(Excel2007+)
pom依赖导入阿里巴巴的easyexcel即可
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.7</version>
</dependency>
1、导入Excel
Controller代码
@RequestMapping("uploadExcel")
public String uploadExcel(MultipartFile file) {
try {
List<JSONObject> contentList = ExcelUtil.readExcelContent(file, 1, 0);
return "ok";
} catch (Exception e) {
e.printStackTrace();
return e.getMessage();
}
}
工具类ExcelUtil
/**
* 导入excel模块
* headerLineCount:标题的行数
* sheetAt:读取几第个sheet(从0开始)
*/
public static List<JSONObject> readExcelContent(MultipartFile file, Integer headerLineCount, Integer sheetAt) throws Exception {
List<JSONObject> content = Lists.newArrayList();
// 上传文件名
Workbook wb = ExcelUtil.getWb(file);
if (wb == null) {
throw new Exception("导入模板不合法,请排查!!");
}
Sheet sheet = wb.getSheetAt(sheetAt);
// 得到总行数
int rowNum = sheet.getLastRowNum();
Row row;
// 正文内容应该从第headerLine行开始
for (int i = headerLineCount; i <= rowNum; i++) {
row = sheet.getRow(i);
JSONObject map = new JSONObject();
boolean hasData = false;
//得到第row行的列数
int colNum = row.getPhysicalNumberOfCells();
for (int j = 0; j < colNum; j++) {
Cell cell = row.getCell(j);
//下面两行不可少,需要重新设置类型和值
CellType cellType = cell.getCellTypeEnum();
String val= ExcelUtil.getCellContent(cell);
//日期默认是数字类型,判断是否为数字类型
if (cellType.equals(CellType.NUMERIC)) {
cell.setCellType(CellType.NUMERIC);
cell.setCellValue(Double.parseDouble(val));
//判断是否是日期类型
if (DateUtil.isCellDateFormatted(cell)) {
Date tempValue = cell.getDateCellValue();
SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
val= simpleFormat.format(tempValue);
} else {
val= String.valueOf(cell.getNumericCellValue());
}
} else {
cell.setCellType(CellType.STRING);
val= cell.getStringCellValue();
}
if (StringUtils.isNotEmpty(val)) {
hasData = true;
}
}
if (hasData) {
content.add(map);
}
}
return content;
}
2、导出Excel
Controller
@RequestMapping("downloadExcel")
public void downloadExcel(HttpServletResponse response) {
try {
String jsonStr="[" +
" {" +
" \"field1\":\"姓名\"," +
" \"field2\":\"性别\"," +
" \"field3\":\"年龄\"" +
" }," +
" {" +
" \"name\":\"小明\"," +
" \"sex\":\"男\"," +
" \"age\":\"18\"" +
" }," +
" {" +
" \"name\":\"小红\"," +
" \"sex\":\"女\"," +
" \"age\":\"20\"" +
" }" +
"]";
JSONArray dataArray = JSONArray.parseArray(jsonStr);
List<List<String>> rowList = new ArrayList<>();
for(int i=0;i<dataArray.size();i++){
//字段名
List<String> cellList = new ArrayList<>();
JSONObject cellJSON=dataArray.getJSONObject(i);
for (Map.Entry<String, Object> entry: cellJSON.entrySet()) {
String val = entry.getValue()+"";
cellList.add(val);
}
rowList.add(cellList);
}
ExcelUtil.exportExcel(response, rowList, "数据模板", "数据模板", 15);
} catch (Exception e) {
e.printStackTrace();
}
}
工具类ExcelUtil
/**
* Excel表格导出
*
* @param response HttpServletResponse对象
* @param excelData Excel表格的数据,封装为List<List<String>>
* @param sheetName sheet的名字
* @param fileName 导出Excel的文件名
* @param columnWidth Excel表格的宽度,建议为15
* @throws IOException 抛IO异常
*/
public static void exportExcel(HttpServletResponse response,
List<List<String>> excelData,
String sheetName,
String fileName,
int columnWidth) throws IOException {
fileName+=".xlsx";
//生成excel
XSSFWorkbook workbook=manage(excelData,sheetName,columnWidth);
//准备将Excel的输出流通过response输出到页面下载
//八进制输出流
response.setContentType("application/octet-stream");
//设置导出Excel的名称
response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")+";"+"filename*=utf-8''"+URLEncoder.encode(fileName, "UTF-8"));
//刷新缓冲
response.flushBuffer();
//workbook将Excel写入到response的输出流中,供页面下载该Excel文件
workbook.write(response.getOutputStream());
//关闭workbook
workbook.close();
}
/**
* 根据输入的信息生成excel
* @param excelData
* @param sheetName
* @param columnWidth
* @return
*/
private static XSSFWorkbook manage(List<List<String>> excelData, String sheetName, int columnWidth){
//声明一个工作簿
XSSFWorkbook workbook = new XSSFWorkbook();
//生成一个表格,设置表格名称
XSSFSheet sheet = workbook.createSheet(sheetName);
//设置表格列宽度
sheet.setDefaultColumnWidth(columnWidth);
//写入List<List<String>>中的数据
int rowIndex = 0;
for (List<String> data : excelData) {
//创建一个row行,然后自增1
XSSFRow row = sheet.createRow(rowIndex++);
//遍历添加本行数据
for (int i = 0; i < data.size(); i++) {
//创建一个单元格
XSSFCell cell = row.createCell(i);
cell.setCellType(CellType.STRING);
//创建一个内容对象
XSSFRichTextString text = new XSSFRichTextString(data.get(i));
//将内容对象的文字内容写入到单元格中
cell.setCellValue(text);
}
}
return workbook;
}