Java使用模板导出Excel

本文介绍了一种使用Java进行Excel数据导出的方法,包括如何读取模板、填充数据并生成包含图表的Excel文件。文章详细展示了如何利用XSSFWorkbook处理多Sheet、设置公式重新计算及导出列表数据。

导出类如下:

 public String outputEXcel(HttpServletRequest request, HttpServletResponse response) {

        //报表模板路径
        String importFilePath = "/inventory_gap_rate.xlsx";
        //还需要判断文件格式
        File fi = new File(importFilePath);
        if(importFilePath != "" && StringUtil.isNotEmpty(importFilePath) && fi.exists()){

            InputStream in = null;
            XSSFWorkbook wb = null;
            try {
                //excel模板路径
                in = new FileInputStream(fi);
                //读取excel模板
                wb = new XSSFWorkbook(in);
            } catch (FileNotFoundException e) {
                log.error("输入流异常", e);
            } catch (IOException e) {
                e.printStackTrace();
                log.error("读取Excel模板异常", e);
            }
            //判断Sheet的个数,避免出现越界。
            if(wb.getNumberOfSheets() == 2){
                //读取了模板内图表所需数据
                XSSFSheet sheet = wb.getSheetAt(1);
                //获取第一个sheet
                XSSFSheet sheetAboutList = wb.getSheetAt(0);
                //如果这行没有了,整个公式都不会有自动计算的效果的
                sheet.setForceFormulaRecalculation(true);

                //获取信息1
                ArrayList<HashMap<String, Object>> inventoryGapRate = dao.getInventoryGapRate();
                //获取信息2
                ArrayList<HashMap<String, Object>> dailySaleInventoryGap = dao.getDailySaleInventoryGap();

                //导出图表数据
                if (inventoryGapRate != null && inventoryGapRate.size() > 0) {
                    for (int i = 0; i < inventoryGapRate.size(); i++) {
                        setInventoryGapRate(i, sheet, inventoryGapRate);
                    }
                }
                //导出信息数据
                if (dailySaleInventoryGap != null && dailySaleInventoryGap.size() > 0) {
                    for (int i = 0; i < dailySaleInventoryGap.size(); i++) {
                        setDailySaleInventoryGap(i,sheetAboutList,dailySaleInventoryGap);
                    }
                }
            }

            try {
                //下载时文件的名称
                String filename = "导出excel.xlsx";
                //设置编码
                if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) {
                    filename = new String(filename.toString().getBytes("utf-8"),  "iso-8859-1");
                } else {
                    filename = URLEncoder.encode(filename.toString(), "UTF-8");
                }
                //文件类型
                response.setContentType("application/vnd.ms-excel");
                //导出文件的信息
                response.setHeader("Content-disposition", "attachment;filename=" + filename);
                OutputStream ouputStream = response.getOutputStream();
                wb.write(ouputStream);
                ouputStream.flush();
                ouputStream.close();

            } catch (IOException e) {
                log.error("写出Excel IO异常", e);
            }
        }else{

        }
        return "";

    }

根据excel模板动态导出数据库数据 package text; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import javax.servlet.ServletContext; import net.sf.jxls.transformer.XLSTransformer; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class TextAction extends ActionSupport { /** */ private static final long serialVersionUID = 1L; private String filename; @SuppressWarnings("rawtypes") public String export() throws Exception { String templateFile = "18.xls"; // String sql = "select * from t_ry order by rybm"; // exportAndDownload(templateFile, DataBase.retrieve(sql)); List datas = new ArrayList(); @SuppressWarnings("unchecked") HashMap map = new HashMap(); map.put("name", "1111"); datas.add(map); exportAndDownload(templateFile, datas); return SUCCESS; } @SuppressWarnings({ "rawtypes", "unchecked" }) public void exportAndDownload(String templateFile, List datas) { try { filename = UUID.randomUUID() + templateFile; // FacesContext context = FacesContext.getCurrentInstance(); // ServletContext servletContext = (ServletContext) // context.getExternalContext().getContext(); ServletContext servletContext = ServletActionContext .getServletContext(); String path = servletContext.getRealPath("\\ExcelFile"); String srcFilePath = path + "\\template\\" + templateFile; String destFilePath = path + "\\download\\" + filename; Map beanParams = new HashMap(); beanParams.put("results", datas); XLSTransformer transfer = new XLSTransformer(); transfer.transformXLS(srcFilePath, beanParams, destFilePath); // Browser.execClientScript("window.location.href='../ExcelFile/downloadfile.jsp?filename=" // + destFile + "';"); } catch (Exception e) { e.printStackTrace(); } } public String getFilename() { return filename; } public void setFilename(String filename) { this.filename = filename; } }
Java 使用模板导出 Excel 表格可以借助 Apache POI 或 Alibaba EasyExcel 等工具实现。 #### 使用 Apache POI 实现 以下是一个使用 Apache POI 基于模板导出 Excel 的示例代码: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class ExcelTemplateExport { public static void main(String[] args) { try { // 读取模板文件 FileInputStream templateInputStream = new FileInputStream("template.xlsx"); Workbook workbook = new XSSFWorkbook(templateInputStream); // 获取第一个工作表 Sheet sheet = workbook.getSheetAt(0); // 在指定单元格写入数据 Row row = sheet.getRow(1); Cell cell = row.getCell(0); cell.setCellValue("新的数据"); // 导出文件 FileOutputStream outputStream = new FileOutputStream("output.xlsx"); workbook.write(outputStream); // 关闭流 templateInputStream.close(); outputStream.close(); workbook.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 上述代码通过读取模板文件,修改指定单元格的数据,最后将修改后的内容导出为新的 Excel 文件。 #### 使用 Alibaba EasyExcel 实现 若要使用自定义的合并策略,可参考以下示例代码,这里使用了自定义的行合并策略 `CustomRowMergeStrategy`: ```java import com.alibaba.excel.EasyExcel; import com.alibaba.excel.write.merge.AbstractMergeStrategy; import java.util.ArrayList; import java.util.List; public class EasyExcelTemplateExport { public static void main(String[] args) { // 定义合并列 List<Integer> mergeCols = new ArrayList<>(); mergeCols.add(0); mergeCols.add(1); // 创建自定义合并策略 AbstractMergeStrategy mergeStrategy = new CustomRowMergeStrategy(mergeCols); // 数据列表 List<List<Object>> data = new ArrayList<>(); // 这里可以添加具体的数据 // 导出文件 EasyExcel.write("output.xlsx") .withTemplate("template.xlsx") .registerWriteHandler(mergeStrategy) .sheet() .doWrite(data); } } ``` `CustomRowMergeStrategy` 类的实现如下: ```java import cn.com.shouzhu.framework.excel.core.enums.CellMergeEnum; import cn.com.shouzhu.framework.excel.core.util.MergeUtils; import com.alibaba.excel.metadata.Head; import com.alibaba.excel.write.merge.AbstractMergeStrategy; import org.apache.commons.collections4.CollectionUtils; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Sheet; import java.util.ArrayList; import java.util.List; public class CustomRowMergeStrategy extends AbstractMergeStrategy { private List<Integer> mergeCols; public CustomRowMergeStrategy() { } public CustomRowMergeStrategy(List<Integer> mergeCols) { this.mergeCols = mergeCols; } @Override protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) { if (CollectionUtils.isNotEmpty(this.mergeCols) && !this.mergeCols.contains(cell.getColumnIndex())) { return; } MergeUtils.mergeCell(cell.getSheet(), cell, CellMergeEnum.ROW, mergeCols.size()); } } ``` 上述代码使用了自定义的行合并策略,通过 `EasyExcel` 基于模板导出 Excel 文件,并应用了合并策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值