Java 生成 Excel 并下载,一次搞定!
各位程序员大兄弟们,大家好!今天,咱们来聊聊一个老生常谈,却又让人头疼不已的—用 Java 生成 Excel 并实现下载。这不,前阵子小胖收到不少小伙伴的私信,各位都表示写 Java 代码生成 Excel 老出卡壳了半天。
所以,小胖今天就化身私家讲师,手把手教大家如何用 Java 轻松搞定 Excel 生成和下载。看啥看,赶紧准备好纸笔,搬好小板凳,上课啦!
貌似有很多方法,哪种最靠谱?
小胖先给大家打个预防针,方法是不少,但有几个是真能用的?不用我说,大家都懂的哈!
咱们今天的主角是 Apache POI,它可是个大牛,专治各种生成 Excel 的顽疾。不信?那咱直接上代码:
在项目里加点料:
java
接下来就是正儿八经生成 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小时内与您取得联系。