Java导出导入Excel方法

使用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;
}

猜你喜欢

转载自blog.csdn.net/JohnGene/article/details/125843229