springboot实现文件的输入输出

本文介绍了如何在SpringBoot中实现Excel(包括xlsx和xls)和CSV文件的输入输出,以及PDF的生成。使用Apache POI库处理Excel,根据数据库查询结果创建工作簿和sheet。同时提到了MultipartFile和File的知识,以及如何处理不同Excel版本。对于CSV,文章解释了其文件格式和用途,并提供了导入导出的实现。最后,文章提及了PDF模板的输出,但未展开详细说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里主要是实现excel,CSV文件的输入输出及PDF的输出。
1,首先是excel,使用poi实现导入导出

POI详细介绍参考:https://www.cnblogs.com/huajiezh/p/5467821.html
常识:
xlsx和xls都是excel文件名扩展名,xls是早期excel使用的,xlsx为后续excel版本才开始使用。主要有以下区别:
1、xls是excel 2007之前版本的使用的默认格式。xlsx是excel 2007之后的版本使用的默认格式,包括2007的版本。
2、XLSX格式的占用空间比XLS的小。xlsx是用新的基于XML的压缩文件格式取代了xls默认文件格式。
3、excel 2007之前的版本无法直接打开xlsx格式的,版本较低不兼容。但可通过安装office兼容性补丁包来实现打开编辑。
4、excel 2007之后的版本可以直接打开XLS、xlsx。软件是向下兼容的。如果要使低版本的也可以打开,可以在保存时选择excel 97-2003.xls格式的。

在POI中,解析.XLS使用的是HSSFWorkbook,解析.XLSX的解析用的是XSSFWorkbook,需要判断处理
具体过程:
2. 1 数据库信息的查询。
将数据库中的某张表中的数据进行一个查询,将查询到的数据进行写入excel文件中。
2. 2 建立一张excel表进行存储查询到的数据。
建立一张excel表,首先建立一个工作簿,然后建立一个sheet,在sheet中建立一行作为表头,将数据库查询到的数据分别放到对应的表头的下方。

MultipartFile与File的知识: https://blog.youkuaiyun.com/sdut406/article/details/85647982
以下数据库操作不涉及,单纯实现这种思想:
实体封装:(运行结果有问题,但是这里只是单纯的实现功能)

package com.ssn.demo.controller;

import lombok.Data;

@Data
public class User {

private String deptNO;

private String deptName;

private String deptNum;
}

实现的控制层:

package com.ssn.demo.controller;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

@Controller
public class TestController {

// 2003版及以前
public static final String EXCEL_XLS = "xls";
// 2007版及以后
private static final String EXCEL_XLSX = "xlsx";

/**
 * 判断是否为excel 
 * @throws Exception 
 */
public void checkExcel(String fileName) throws Exception {
    // 不是文件,且不是EXCEL_XLS和EXCEL_XLSX结尾的
    if (fileName.endsWith(EXCEL_XLS) || fileName.endsWith(EXCEL_XLSX)) {
        throw new Exception("不是excel文件");
    }
} 

/**
 * 判断excel的版本,得到对应的Workbook
 */
public Workbook getWorkbook(InputStream in, MultipartFile file) throws Exception {
    Workbook workbook = null;
    if (file.getName().endsWith(EXCEL_XLS)) { // excel 2003
        workbook = new HSSFWorkbook(in);
    }
    if (file.getName().endsWith(EXCEL_XLSX)) { // excel 2007/10
        workbook = new XSSFWorkbook(in);
    }
    return workbook;
    
}

/**
 * 生成excel并将虚拟好的数据写入
 * @throws IOException 
 */
@RequestMapping("/excelExport")
@ResponseBody
public Object excelExport(HttpServletResponse response) throws IOException {
    // 如果你想操作数据库,也可以操作。这里建议用高版本
    HSSFWorkbook workbook = new HSSFWorkbook(); //Excel的文档对象 2003
    
    // 以下的参数,都可以抽象化,从而实现代码的可读性
    HSSFSheet sheet = workbook.createSheet("excel测试表格"); // 创建sheet表单并命名
    
    // 创建第一行
    HSSFRow row = null; // Excel的行
    row = sheet.createRow(0); // 创建第一行
    row.setHeight((short)(26.25*20)); //设置行高
    row.createCell(0).setCellValue("用户列表");// 为第一个单元格设值
    // 将首行用三个单元格表示,即是合并列(你也可以合并行)
    CellRangeAddress rowRange = new CellRangeAddress(0,0,0,3); 
    sheet.addMergedRegion(rowRange); // 合并整合到sheet
    
    //创建第一行
    row = sheet.createRow(1);
    row.setHeight((short)(22.25*20)); 
    row.createCell(0).setCellValue("部门名ID"); // 为第一个单元格设值
    row.createCell(1).setCellValue("部门名"); // 为第二个单元格设值
    row.createCell(2).setCellValue("部门员工数"); // 为第三个单元格设值
    
    for(int i = 0; i < 6; i++) { // 这里模拟从数据库取出的数据
        row = sheet.createRow(i + 2)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值