使用Apache POI实现数据源导出到Excel表

1)Apache POI

        Apache POI是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。POI为“Poor Obfuscation Implementation”的首字母缩写,意为“简洁版的模糊实现“。

基本功能:

HSSF - 提供读写Microsoft Excel格式档案的功能。
XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。
OOXML:Offic Open XML,微软以XML为基础并以ZIP格式压塑的电子文件规范,支持文件,表格,备忘录,幻灯片等格式。
从Microsoft Offic 2007开始,OOXML已经成为Microsoft Offic默认的文件格式。
HWPF - 提供读写Microsoft Word格式档案的功能。
HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
HDGF - 提供读写Microsoft Visio格式档案的功能。


maven pom.xml:

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

2)实现

核心代码:

/**
 * 下载
 * @param response
 * @param list
 * @param clazz
 * @param templatePath
 * @param templateName
 * @throws Exception
 */
public static void download(HttpServletResponse response, List list, Class clazz, String templatePath, String templateName) throws Exception {
	SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/M/d");
	OutputStream os = response.getOutputStream();
	try {
		XSSFWorkbook workbook = ExcelUtil.getExportWorkBook(list, clazz, templatePath);
		response.setHeader("Content-Disposition", "attachment; filename='" + templateName + "'");
		response.setContentType("application/vnd.ms-excel");
		workbook.write(os);
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		if (os != null) {
			os.close();
		}
	}
}
/**
 * 获取导出Excel工作薄
 *
 * @param list         数据源
 * @param clazz        类
 * @param templatePath 模板路径
 * @return
 * @throws Exception
 */
public static XSSFWorkbook getExportWorkBook(List list, Class clazz, String templatePath) throws Exception {
	//获取导入模板
	InputStream in = ExcelUtil.class.getResourceAsStream(templatePath);
	XSSFWorkbook wb = new XSSFWorkbook(in);
	XSSFSheet sheet = wb.getSheetAt(0);
	//写入数据
	writeDate(sheet, clazz, list);
	return wb;
}
/**
 * 写入数据
 *
 * @param sheet    表格
 * @param clazz    类
 * @param list     数据源
 * @throws Exception
 */
public static void writeDate( XSSFSheet sheet, Class clazz, List list) throws Exception {
	int propertyRowNum = 2;
	XSSFRow propertyRow = sheet.getRow(propertyRowNum);//获取属性行
	int columnCount = propertyRow.getLastCellNum();//获取属性行的列数
	//循环赋值
	for (int i = 0; i < list.size(); i++) {
		Row dataRow = sheet.createRow(propertyRowNum + 1 + i);
		//循环为每列赋值
		for (int j = 0; j < columnCount; j++) {
			String propertyString = propertyRow.getCell(j).getStringCellValue();
			if (StringUtil.isEmpty(propertyString)) {
				continue;
			}
			Method getMethod = getGetMethod(clazz, propertyString);//使用反射来获取方法和赋值
			if (getMethod != null) {
				Cell cell = dataRow.createCell(j);
				CellStyle cellStyle = propertyRow.getCell(j).getCellStyle();
				cell.setCellStyle(cellStyle);
				setCell(list.get(i), getMethod, cell);
			} else {
				dataRow.createCell(j).setCellValue("");
			}
		}
	}
	sheet.shiftRows(propertyRowNum + 1, sheet.getLastRowNum(), -1);//删除属性行(该函数从起始行,到结束行,上移一行)
}

/**
 * 根据关键词查找对应的get方法
 *
 * @param objectClass
 * @param fieldName
 * @return
 */
public static Method getGetMethod(Class objectClass, String fieldName) {
	StringBuffer sb = new StringBuffer();
	sb.append("get");
	sb.append(fieldName.substring(0, 1).toUpperCase());
	sb.append(fieldName.substring(1));
	try {
		return objectClass.getMethod(sb.toString());
	} catch (Exception e) {
	}
	return null;
}
/**
 * 设置单元格值
 * @param object
 * @param method
 * @param cell
 * @return
 * @throws Exception
 */
private static Cell setCell(Object object, Method method, Cell cell) throws Exception {
	String returnType = method.getReturnType().getName();
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy/M/d");
	switch (returnType) {
		case "java.util.Date": {
			java.util.Date cellValue = (java.util.Date) method.invoke(object);
			if (cellValue != null) {
				cell.setCellValue(sdf.format(cellValue));
			}
		}
		break;
		case "java.lang.Float": {
			Float cellValue = (java.lang.Float) method.invoke(object);
			if (cellValue != null) {
				cell.setCellValue(Double.valueOf(cellValue.toString()));
			}
		}
		break;
		case "java.lang.Double": {
			Double cellValue = (java.lang.Double) method.invoke(object);
			if (cellValue != null) {
				cell.setCellValue(cellValue);
			}
		}
		break;
		case "java.lang.String": {
			String cellValue = (java.lang.String) method.invoke(object);
			if (StringUtil.isNotEmpty(cellValue)) {
				cell.setCellValue(cellValue);
			}
		}
		default:
			break;
	}
	return cell;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,你需要使用Apache POI库来处理Excel文件,然后按照以下步骤进行操作: 1. 首先,你需要定义一个实体类,用于映射到数据中的数据。例如,我们将创建一个名为“Person”的实体类。 ```java @Entity @Table(name = "person") public class Person { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private int age; private String email; // getters and setters } ``` 2. 在你的控制器中,定义一个方法来获取要导出数据。在这个例子中,我们将获取所有的Person实体。 ```java @GetMapping("/export") public void exportToExcel(HttpServletResponse response) throws IOException { List<Person> persons = personRepository.findAll(); // call the method to export the data to excel export(persons, response); } ``` 3. 创建一个名为“export”的方法,该方法将Person实体列作为参数传入,并将数据导出Excel文件中。 ```java private void export(List<Person> persons, HttpServletResponse response) throws IOException { // create the workbook and sheet Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Persons"); // create the header row Row header = sheet.createRow(0); header.createCell(0).setCellValue("ID"); header.createCell(1).setCellValue("Name"); header.createCell(2).setCellValue("Age"); header.createCell(3).setCellValue("Email"); // create the data rows int rowNum = 1; for (Person person : persons) { Row row = sheet.createRow(rowNum++); row.createCell(0).setCellValue(person.getId()); row.createCell(1).setCellValue(person.getName()); row.createCell(2).setCellValue(person.getAge()); row.createCell(3).setCellValue(person.getEmail()); } // set the response headers response.setHeader("Content-Disposition", "attachment; filename=\"persons.xlsx\""); response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); // write the workbook to the response output stream workbook.write(response.getOutputStream()); workbook.close(); } ``` 4. 最后,在你的应用程序中,你需要配置JPA以连接到数据库。在这个例子中,我们将使用Spring Data JPA来完成这个任务。在你的应用程序中添加以下依赖项。 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> ``` 然后,配置JPA数据源和实体管理器工厂。在application.properties文件中添加以下配置。 ``` spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=root spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=update ``` 这将为你的应用程序提供一个JPA数据源,并且自动创建格。 以上是利用jpa实现数据导出Excel的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值