全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:138-2348-1213

java生成excel并下载,用 Java 怎么实现

Java 生成 Excel 并下载,一次搞定!

各位程序员大兄弟们,大家好!今天,咱们来聊聊一个老生常谈,却又让人头疼不已的—用 Java 生成 Excel 并实现下载。这不,前阵子小胖收到不少小伙伴的私信,各位都表示写 Java 代码生成 Excel 老出卡壳了半天。

所以,小胖今天就化身私家讲师,手把手教大家如何用 Java 轻松搞定 Excel 生成和下载。看啥看,赶紧准备好纸笔,搬好小板凳,上课啦!

貌似有很多方法,哪种最靠谱?

小胖先给大家打个预防针,方法是不少,但有几个是真能用的?不用我说,大家都懂的哈!

咱们今天的主角是 Apache POI,它可是个大牛,专治各种生成 Excel 的顽疾。不信?那咱直接上代码:

在项目里加点料:

java

org.apache.poi poi 3.17 org.apache.poi poi-ooxml 3.17

接下来就是正儿八经生成 Excel 的时刻了,各位认真看,小胖保证通俗易懂:

java

import org.apache.poi.ss.usermodel.;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

public class ExcelGenerator {

public static void generateExcel(HttpServletResponse response) throws IOException {

// 创建一个工作簿

Workbook workbook = new XSSFWorkbook();

// 创建一个工作表

Sheet sheet = workbook.createSheet("Test Sheet");

// 创建一个单元格样式

CellStyle cellStyle = workbook.createCellStyle();

cellStyle.setFillForegroundColor(IndexedColors.LIGHT_GREEN.getIndex());

cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);

// 创建一个单元格

Cell cell = sheet.createRow(0).createCell(0);

cell.setCellValue("Hello, World!");

cell.setCellStyle(cellStyle);

// 将工作簿写到响应输出流中

workbook.write(response.getOutputStream());

这段代码是不是看起来很眼熟?别慌,咱们一步步分解:

我们导入了 Apache POI 的相关包,然后在 generateExcel 方法中创建了一个工作簿、一个工作表和一个单元格。接下来,我们给单元格设置了一个绿色背景的样式,并在单元格中写入了文本 "Hello, World!",最后将工作簿写入响应输出流中。

很简单吧?不用谢,这是小胖的基本功!

生成 Excel 没可咋直接下载呢?

下载 Excel,这算啥小胖分分钟搞定!

继续在 generateExcel 方法里加点料:

java

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

public class ExcelGenerator {

public static void generateExcel(HttpServletResponse response) throws IOException {

// 设置响应头,指定下载的文件名

response.setHeader("Content-Disposition", "attachment; filename=test.xlsx");

// 设置响应内容类型

response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

这就齐活啦!在设置响应头时,我们指定了下载的文件名为 "test.xlsx",并且设置了响应内容类型为 "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"。这样一来,当用户点击下载链接时,浏览器就会自动触发下载操作,并以 "test.xlsx" 的文件名保存文件。

数据量庞大,Excel 会不会卡死?

谁跟你说数据量庞大会卡死?Java 用起来,效率杠杠的!

小胖今天给大家支一招,用 Apache HSSF Streaming 来处理大数据量的 Excel。

再来点代码:

java

import org.apache.poi.hssf.eventusermodel.;

import org.apache.poi.hssf.eventusermodel.HSSFEventFactory.HSSFListenerFactory;

import org.apache.poi.hssf.record.SSTRecord;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import org.apache.poi.poifs.filesystem.POIFSFileSystem;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

import java.io.InputStream;

import java.util.ArrayList;

import java.util.List;

public class LargeExcelGenerator {

public static void generateLargeExcel(HttpServletResponse response) throws IOException {

// 设置响应头,指定下载的文件名

response.setHeader("Content-Disposition", "attachment; filename=large.xlsx");

// 设置响应内容类型

response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

// 创建一个 POIFS 文件系统

InputStream is = new FileInputStream("large.xls");

POIFSFileSystem fs = new POIFSFileSystem(is);

// 创建一个 HSSF 工作簿

HSSFWorkbook workbook = new HSSFWorkbook(fs);

// 获取工作簿中的 SST 记录

SSTRecord sstRecord = workbook.getSSTString();

// 设置 HSSF 事件工厂

HSSFListenerFactory factory = new HSSFListenerFactory();

// 创建一个 SAX 事件处理器

CellToolsListener listener = new CellToolsListener(sstRecord);

// 创建一个 SAX 解析器

SAXParserFactory spf = SAXParserFactory.newInstance();

SAXParser saxParser = spf.newSAXParser();

// 解析工作簿

saxParser.parse(fs.createDocumentInputStream("Workbook"), listener);

// 获取单元格数据

List> data = listener.getData();

// 创建一个新的 HSSF 工作簿

HSSFWorkbook newWorkbook = new HSSFWorkbook();

// 创建一个新的工作表

Sheet sheet = newWorkbook.createSheet("Test Sheet");

// 写入单元格数据

for (int i = 0; i < data.size(); i++) {

Row row = sheet.createRow(i);

for (int j = 0; j < data.get(i).size(); j++) {

Cell cell = row.createCell(j);

cell.setCellValue(data.get(i).get(j));

// 将工作簿写到响应输出流中

newWorkbook.write(response.getOutputStream());

是不是有点晕?不要怕,小胖来给你捋捋:

这段代码通过 Apache HSSF Streaming 技术,实现了对大数据量 Excel 的处理。它将 Excel 文件分成较小的块,顺序处理,极大地提高了效率。

图文混排,我该咋办?

图文混排算啥难事?跟着小胖搞定它!

代码如下:

java

import org.apache.poi.hssf.usermodel.HSSFClientAnchor;

import org.apache.poi.hssf.usermodel.HSSFPatriarch;

import org.apache.poi.hssf.usermodel.HSSFShape;

import org.apache.poi.hssf.usermodel.HSSFSheet;

import org.apache.poi.ss.usermodel.ClientAnchor;

import org.apache.poi.ss.usermodel.Workbook;

import org.apache.poi.util.IOUtils;

import javax.servlet.http.HttpServletResponse;

import java.io.ByteArrayInputStream;

import java.io.IOException;

import java.io.InputStream;

public class ImageExcelGenerator {

public static void generateImageExcel(HttpServletResponse response) throws IOException {

// 设置响应头,指定下载的文件名

response.setHeader("Content-Disposition", "attachment; filename=image.xlsx");

// 设置响应内容类型

response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

// 创建一个新的 HSSF 工作簿

Workbook workbook = new HSSFWorkbook();

// 创建一个新的工作表

HSSFSheet sheet = (HSSFSheet) workbook.createSheet("Test Sheet");

// 创建一个 HSSF 父级对象

HSSFPatriarch patriarch = sheet.createDrawingPatriarch();

// 创建一个图片对象

InputStream is = new ByteArrayInputStream(IOUtils.toByteArray(ImageExcelGenerator.class.getResourceAsStream("/image.png")));

HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, 0, 0, 10

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。