poi实现Excel文件的导入导出

这篇具有很好参考价值的文章主要介绍了poi实现Excel文件的导入导出。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

poi结构说明

HSSF提供读写Microsoft Excel XLS格式档案的功能
XSSF提供读写Microsoft Excel OOXML XLSX格式档案的功能
HWPF提供读写Microsoft Word DOC格式档案的功能
HSLF提供读写Microsoft PowerPoint格式档案的功能
HDGF提供读Microsoft Visio格式档案的功能
HPBF提供读Microsoft Publisher格式档案的功能
HSMF提供读Microsoft Outlook格式档案的功能

引入poi依赖包

<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi</artifactId>
	<version>4.0.0</version>
</dependency>
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-ooxml</artifactId>
	<version>4.0.0</version>
</dependency>

一、Excel文件的导出

第一步、获取表内容数据:
根据表头内容与实体类属性对应的map,利用反射机制获取get方法来取出该实体数据

/**
* @param excelName  文件名称
* @param fileFormat 文件格式
* @param sheetName  sheet页名称
* @param map        表头内容-实体类属性
* @param lists      表数据
* @param response   导出
*/
public static void exportExcel(String excelName, String fileFormat, String sheetName,
                              Map<String, String> map, List<?> lists, HttpServletResponse response) {
	List<String> titleLists = new ArrayList<>();
	List<String> attributeLists = new ArrayList<>();
	for (String next : map.keySet()) {
		titleLists.add(next);
		attributeLists.add(map.get(next));
	}
	Map<Integer, List<String>> contents = new LinkedHashMap<>();
	for (int i = 0; i < lists.size(); i++) {
		List<String> list = new ArrayList<>();
		for (String s : attributeLists) {
			String value = EntityIsNull.getValue(s, lists.get(i),null);
			if (value != null && !"".equals(value)) {
				list.add(value);
			} else {
				list.add("");
			}
		}
		contents.put(i, list);
	}
	export(excelName, fileFormat, sheetName, titleLists, contents, response);
}

第二步、开始导出

/**
* @param excelName  文件名称
* @param fileFormat 文件格式
* @param sheetName  sheet页名称
* @param titles     表头内容
* @param contents   表格内容
* @param response   导出
*/
private static void export(String excelName, String fileFormat, String sheetName, List<String> titles,
                          Map<Integer, List<String>> contents, HttpServletResponse response) {
   Workbook workbook = null;
   try {
       if ("xls".equalsIgnoreCase(fileFormat)) {
           workbook = new HSSFWorkbook();
       } else if ("xlsx".equalsIgnoreCase(fileFormat)) {
           workbook = new XSSFWorkbook();
       } else {
           workbook = new SXSSFWorkbook(100);
       }
       sheetName = sheetName != null ? sheetName : "sheet";
       CellStyle style = getStyle(workbook, false);
       Sheet sheet = workbook.createSheet(sheetName);
       //定义当前表格下标
       int lastRowNum = 0;
       //创建行
       Row titleRow = sheet.createRow(lastRowNum);
       //设置行高
       titleRow.setHeightInPoints(22);
       //写入表格标题
       for (int i = 0; i < titles.size(); i++) {
           //创建列
           Cell titleCell = titleRow.createCell(i);
           //设置单元格属性
           titleCell.setCellType(CellType.STRING);
           //写入内容
           titleCell.setCellValue(titles.get(i));
           //设置样式
           titleCell.setCellStyle(style);
       }
       lastRowNum++;
       //写入表格内容
       for (int i = 0; i < contents.size(); i++) {
           Row contentRow = sheet.createRow(lastRowNum + i);
           contentRow.setHeightInPoints(22);
           List<String> list = contents.get(i);
           for (int j = 0; j < list.size(); j++) {
               Cell cell = contentRow.createCell(j);
               cell.setCellType(CellType.STRING);
               cell.setCellValue(list.get(j));
               cell.setCellStyle(style);
           }
       }
       //设置自动列宽
       setSizeColumn(sheet, titleRow.getPhysicalNumberOfCells());
       workbook.write(generateResponseExcel(excelName, response));
   } catch (Exception e) {
       e.printStackTrace();
   } finally {
       try {
           if (workbook != null) {
               workbook.close();
           }
       } catch (IOException e) {
           e.printStackTrace();
       }
   }
}

编辑表格内样式

/** 表格内样式调整 */
public static CellStyle getStyle(Workbook workbook, boolean setFont) {
    CellStyle cellStyle = workbook.createCellStyle();
    //设置内容居中-水平居中
    cellStyle.setAlignment(HorizontalAlignment.CENTER);
    //设置内容居中-垂直居中
    cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
    //设置边框 THIN--细实线 DOTTED--细虚线
    cellStyle.setBorderTop(BorderStyle.THIN);
    cellStyle.setBorderLeft(BorderStyle.THIN);
    cellStyle.setBorderRight(BorderStyle.THIN);
    cellStyle.setBorderBottom(BorderStyle.THIN);
    //设置字体
    if (setFont) {
        Font font = workbook.createFont();
        //字体加粗
        font.setBold(true);
        //字体格式
        font.setFontName("宋体");
        //字体字号
        font.setFontHeight((short) (18 * 20));
        cellStyle.setFont(font);
    }
    //设置文字自动换行
    cellStyle.setWrapText(false);
    return cellStyle;
}

第三步、设定响应请求头格式,发送文件到客户端

/**
 * @param excelName 要生成的文件名字
 * @param response  返回表格
 */
private static ServletOutputStream generateResponseExcel(String excelName, HttpServletResponse response) throws IOException {
    excelName = excelName == null || "".equals(excelName) ? "excel" : URLEncoder.encode(excelName, "UTF-8");
    response.setContentType("application/vnd.ms-excel;charset=utf-8");
    response.setHeader("Content-Disposition", "attachment; filename=" + excelName + ".xlsx");
    return response.getOutputStream();
}

二、Excel文件的导入

/**
* @param file 文件
* @param map  表头内容-实体类属性
* @return List<Map < String, String>>
*/
public static List<Map<String, String>> importExcel(MultipartFile file, Map<String, String> map) {
   //存储表格数据
   List<Map<String, String>> list = new ArrayList<>();
   String fileName = file.getOriginalFilename();
   if (fileName != null) {
   		fileName = fileName.substring(fileName.lastIndexOf(".") + 1);
   }
   Workbook workbook = null;
   InputStream inputStream = null;
   try {
       inputStream = file.getInputStream();
       if ("xls".equalsIgnoreCase(fileName)) {
           workbook = new HSSFWorkbook(inputStream);
       } else {
           workbook = new XSSFWorkbook(inputStream);
       }else {
		   workbook = WorkbookFactory.create(inputStream);
	   }
       //获取第一个sheet页内容
       Sheet sheetAt = workbook.getSheetAt(0);
       //获取表格第一行
       Row titleRow = sheetAt.getRow(0);
       //获取表格行数
       int rowCount = sheetAt.getPhysicalNumberOfRows();
       for (int i = 1; i < rowCount; i++) {
           Map<String, String> hashMap = new HashMap<>();
           //从表格第二行开始读取
           Row contentRow = sheetAt.getRow(i);
           if (!isEmptyRow(contentRow)) {
               //获取行中的列数
               int cellCount = contentRow.getPhysicalNumberOfCells();
               for (int j = 0; j < cellCount; j++) {
                   Cell titleCell = titleRow.getCell(j);
                   Cell contentCell = contentRow.getCell(j);
                   String value = null;
                   switch (contentCell.getCellType()) {
                       case STRING:
                           value = contentCell.getStringCellValue().trim();
                           value = StringUtils.isEmpty(value) ? "" : value;
                           break;
                       case NUMERIC:
                           if (DateUtil.isCellDateFormatted(contentCell)) {
                               Date date = contentCell.getDateCellValue();
                               value = DateUtils.getString(date, "yyyy-MM-dd HH:mm:ss");
                           } else {
                               contentCell.setCellType(CellType.STRING);
                               value = contentCell.getStringCellValue();
                               value = StringUtils.isEmpty(value) ? "" : value;
                           }
                           break;
                       case BOOLEAN:
                           value = String.valueOf(contentCell.getBooleanCellValue());
                           break;
                       default:
                           value = "";
                           break;
                   }
                   String title = titleCell.getStringCellValue();
                   hashMap.put(map.get(title), value);
               }
               list.add(hashMap);
           }
       }
       workbook.close();
       inputStream.close();
       return list;
   } catch (Exception e) {
       e.printStackTrace();
   }
   return null;
}

判断表格行数据是否为空

/**
* 判断表格行是否为空
*
* @param row 行
* @return boolean
*/
private static boolean isEmptyRow(Row row) {
   if (row == null) {
       return true;
   }
   //表开始列下标
   int firstCellNum = row.getFirstCellNum();
   //表最后列下标
   int lastCellNum = row.getLastCellNum();
   //空列数据
   int nullCellNum = 0;
   for (int i = firstCellNum; i < lastCellNum; i++) {
       Cell cell = row.getCell(i);
       if (cell == null || CellType.BLANK.equals(cell.getCellType())) {
           nullCellNum++;
           continue;
       }
       cell.setCellType(CellType.STRING);
       String cellValue = cell.getStringCellValue().trim();
       if (StringUtils.isEmpty(cellValue)) {
           nullCellNum++;
       }
   }
   return (lastCellNum - firstCellNum) == nullCellNum;
}

判断表格列值是否为空

/**
* 判断列是否为空
*
* @param cell 列
* @return boolean
*/
private static boolean isEmptyCell(Cell cell) {
   return cell == null || CellType.BLANK.equals(cell.getCellType());
}

设置表格自动列宽文章来源地址https://www.toymoban.com/news/detail-531533.html

/** 设置自动列宽 */
private static void setSizeColumn(Sheet sheet, int columnLength) {
   for (int columnNum = 0; columnNum <= columnLength; columnNum++) {
       int columnWidth = sheet.getColumnWidth(columnNum) / 256;
       for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
           Row currentRow; // 当前行未被使用过
           if (sheet.getRow(rowNum) == null) {
               currentRow = sheet.createRow(rowNum);
           } else {
               currentRow = sheet.getRow(rowNum);
           }
           if (currentRow.getCell(columnNum) != null) {
               Cell currentCell = currentRow.getCell(columnNum);
               if (currentCell.getCellType() == CellType.STRING) {
                   int length = currentCell.getStringCellValue().getBytes().length;
                   if (columnWidth < length) {
                       columnWidth = length;
                   }
               }
           }
       }
       sheet.setColumnWidth(columnNum, (int) ((columnWidth + 2.5) * 256));
   }
}

获取对应属性名的值

/**
* 获取对应属性名的值
*
* @param fieldName 字段名
* @param object    对象
* @param format    时间格式(yyyy-MM-dd HH:mm:ss)
* @return String
*/
public static String getValue(String fieldName, Object object, String format) {
	String value = null;
	try {
		String getter = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
		Class<?> aClass = object.getClass();
		Field field = aClass.getDeclaredField(fieldName);
		/** 获取属性类型 */
		String type = field.getGenericType().getTypeName();
		Method method = aClass.getMethod(getter);
		if (type.contains("Date")) {
			Date date = (Date) method.invoke(object);
			/** 设置时间格式 */
			if (date != null) {
				if (format != null && !"".equals(format)) {
					value = DateUtils.getString(date, format);
				} else {
					value = DateUtils.getString(date);
				}
			}
		} else {
			value = method.invoke(object) + "";
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
	return value;
}

测试

public static void main(String[] args) {
    //文件导出
    Map<String, String> map = new HashMap<>();
    map.put("序号", "id");
    map.put("姓名", "userName");
    map.put("地址", "site");
    List<User> userList = new ArrayList<>();
    User user = new User();
    user.setId(1);
    user.setUserName("张三");
    user.setSite("地球");
    userList.add(user);
    exportExcel("用户信息", "xlsx", "用户", map, userList, null);
    //文件导入
    File excelFile = new File("C:/test/用户信息.xlsx");
    List<Map<String, String>> list = importExcel(excelFile, map);
    System.out.println("list = " + list);
}

到了这里,关于poi实现Excel文件的导入导出的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java poi导入Excel、导出excel

    java poi导入Excel、导出excel ReadPatientExcelUtil PoiUtils FileUtils

    2024年02月15日
    浏览(43)
  • POI 实现Excel导入导出

    什么是POI Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能。POI为“Poor Obfuscation Implementation”的首字母缩写,意为“简洁版的模糊实现”。 生成xls和xlsx有什么区别呢? XLS XLSX 只能打开xls格式,无法直接打开x

    2024年02月03日
    浏览(42)
  • JAVA:使用POI SXSSFWorkbook方式导出Excel大数据文件

    Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java对Microsoft Office格式档案读和写的功能。POI组件可以提供Java操作Microsoft Office的API,导出格式为Office 2003时POI调用的HSSF包,导出格式为Office 2007时,调用XSSF包,而SXSSF包是POI3.8版本之上对XSSF的一个扩展,用

    2024年02月11日
    浏览(49)
  • hutool poi、apache poi实现导入导出以及解析excel

    一、前言 看了例子之后后续需要更加深入学习或者更多理解其他API的话,建议看官方文档。hutool项目是中国人维护的,有中文文档,阅读起来很方便。apache poi比较底层一点,可以更加自由去二次开发自己所需的功能。 hutool官方文档 hutool官方gitee apache poi官方文档 二、基于

    2024年02月09日
    浏览(54)
  • poi实现Excel文件导出【SpringBoot篇】

    在系统中,数据库的excel文件导出是一项及为基础的功能。此篇文章将通过实例利用poi实现excel文件导出。 Jakarta POI 是apache的子项目,目标是处理ole2对象。它提供了一组操纵Windows文档的Java API 。目前比较成熟的是HSSF接口,处理MS Excel(97-2002)对象。它不象我们仅仅是用csv生

    2024年02月05日
    浏览(44)
  • Java POI (2)—— Excel文件的上传与导出(实例演示)

             这里是一个demo的流程图,下面按照这个流程图做了一个简单的实现,有部分判断没有加上,实际操作中,可以根据自己的需求进行增加或者修改。并且此处还是在接受文件传入后将文件进行了下载,保存到本地的操作,这个要按照具体情况具体分析,看需求是否

    2024年02月11日
    浏览(52)
  • java poi实现Excel多级表头导出

    最近碰到一个导出,比较繁琐,也查询了许多博客,在其中一篇博客的基础上修改,实现了最终想要的效果。话不多说,直接上效果图 1.主代码: 2.合并单元格 3.设置表头单元格的宽度 4.填充数据(注:我这里的数据格式是ListMapString, Object类型,可以根据自己的实际情况来封

    2024年02月03日
    浏览(47)
  • 一文搞定POI,再也不怕excel导入导出了

    在Java日常开发过程中,实现Excel文件的导入导出功能是一项常见的需求。 通过使用相关的Java库,如Apache POI、EasyPoi或EasyExcel,可以轻松地实现Excel文件的读写操作。 而这篇文章将介绍如何在Java中使用Apache POI、EasyPoi 和EasyExcel库来进行Excel文件的导入和导出操作,帮助您快速掌

    2024年03月11日
    浏览(49)
  • Java使用poi导出excel针对不同数据列配置设置不同单元格格式(适用于通用导出excel数据)

    公司大部分业务都是查询相关的业务, 所以建了一个项目专门做数据查询, 数据中转等抽象通用的业务, 有一天给我安排了一个功能, 做excel导出, 配置好查询sql和表头字段映射后即可导出excel, 无需修改代码 后来因为导出数据要求保留几位小数或者转换成百分比等设置单元格格

    2024年02月07日
    浏览(55)
  • java实现excel的导入导出(带参数校验:非空校验、数据格式校验)

    本次封装引入阿里开源框架EasyExcel,EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。 github地址:GitHub - alibaba/easyexcel: 快速、简洁、解决大文件内存溢出的java处理Excel工具 。 64M内存20秒读取75M(46W行25列)的Excel(3.0.2

    2024年02月01日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包