[Java] Utilice PDI para exportar Excel según el estilo de la plantilla

1. Escena

Exportar a Excel según el estilo de la plantilla.

2. Realización

En primer lugar, por supuesto, debe tener una plantilla de Excel y el estilo de Excel está configurado con wps, etc.
Luego viene la implementación del código, primero introduzca las dependencias de POI:

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

Luego está el código en el método de implementación, primero defina la información de respuesta:

		HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
		// 设置响应类型
		response.setContentType("application/vnd.ms-excel");
		// 设置字符编码
		response.setCharacterEncoding("utf-8");
		// 设置响应头信息
		response.setHeader("Content-Disposition", "attachment; filename="文件名.xlsx", "utf-8"));

Luego convierta la plantilla de Excel en un flujo de entrada. Hay muchas formas de implementar este paso. La elección específica varía de persona a persona. Aquí daré un ejemplo:

		org.springframework.core.io.Resource resource = new ClassPathResource("templates/文件名.xlsx");
		@Cleanup InputStream inputStream = resource.getInputStream();
		ServletOutputStream outputStream = response.getOutputStream();

Luego obtenga los datos de la plantilla de Excel:

		XSSFWorkbook workbook = new XSSFWorkbook(inputStream); // 传入上一步转换的输入流
		Sheet sheet = workbook.getSheetAt(0); // 拿到excel模板的sheet页

Después de obtener los datos de la plantilla de Excel, no debemos exportarlos tal como están; de lo contrario, podemos generarlos directamente a través de io. El siguiente paso es operar los datos de la plantilla de Excel y construirlos en el Excel que queremos exportar. Aquí solo combino algunas operaciones comunes. Las operaciones específicas se pueden combinar según las circunstancias personales:

	/**
	 * 修改某单元格的值,先获取y行再获取y行的x列,然后修改值
	 *
	 * x(列,从0开始计数)
	 * y(行,从0开始计数)
	 * value(修改值)
	 */
	sheet.getRow(y).getCell(x).setCellValue(value);

	/**
	 * 插入n行,首先用shiftRows方法将插入位置后面的数据都向下移动n行
	 * 然后循环用createRow方法构造当前行,并用setHeightInPoints方法设置行高
	 * 最后循环用createCell方法构造当前行的列
	 *
	 * startRow(插入位置的下一行,从0开始计数)
	 * endRow(excel表末尾行,从0开始计数)
	 * startColumn(插入行的开始列,从0开始计数)
	 * endColumn(插入行的结束列,从0开始计数)
	 * rowNum(插入行数)
	 * rowHeight(插入行高)
	 */
	sheet.shiftRows(startRow, endRow, rowNum, true, false);
	for (int i = 0; i < rowNum; i++) {
		Row itemRow = sheet.createRow(startRow + i);
		itemRow.setHeightInPoints(rowHeight);
		for (int j = startColumn; j < endColumn + 1; j++) {
			itemRow.createCell(j);
		}
	}

	/**
	 * 得到某单元格的样式,先获取y行再获取y行的x列,然后得到样式
	 *
	 * x(列,从0开始计数)
	 * y(行,从0开始计数)
	 */
	 CellStyle style = sheet.getRow(y).getCell(x).getCellStyle();

	/**
	 * 修改某单元格的样式,先获取y行再获取y行的x列,然后修改样式
	 *
	 * x(列,从0开始计数)
	 * y(行,从0开始计数)
	 * style(修改样式)
	 */
	 sheet.getRow(y).getCell(x).setCellStyle(style);

	/**
	 * 合并单元格
	 *
	 * startRow(开始行,从0开始计数)
	 * endRow(结束行,从0开始计数)
	 * startColumn(开始列,从0开始计数)
	 * endColumn(结束列,从0开始计数)
	 */
	 sheet.addMergedRegion(new CellRangeAddress(startRow, endRow, startColumn, endColumn));

Finalmente salida excel:

	 workbook.write(outputStream);

3. Resumen

  1. Resumir la tabla de Excel en un gráfico de coordenadas del eje xy facilita la comprensión del funcionamiento de POI. El eje y corresponde a las filas, el eje x corresponde a las columnas y cada celda tiene una coordenada xy.
  2. La celda es el objeto operable real y las filas y columnas solo se usan para ubicar la posición de la celda. Por lo tanto, después de agregar filas, debe realizar un bucle de acuerdo con el número de columnas para agregar celdas.
  3. Las celdas recién agregadas no tienen ningún estilo. Puede obtener los estilos de otras celdas y asignarlos.
  4. Si no implica agregar nuevas filas o columnas a la plantilla, basta con modificar el valor de la celda, después de todo, el estilo de la celda se puede configurar primero en WPS.

Supongo que te gusta

Origin blog.csdn.net/qq_45050480/article/details/128579776
Recomendado
Clasificación