因为业务需要,不知道读取的系统能识别什么样格式的dbf,由此集合多个dbf导出方式为工具类
java
package com.lhw.utils;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.util.MapUtils;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import com.alibaba.fastjson.JSON;
//import com.ewell.medqc.rec.enums.N420DfbEnum;
//import com.linuxense.javadbf.DBFDataType;
//import com.linuxense.javadbf.DBFField;
//import com.linuxense.javadbf.DBFWriter;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
//import java.nio.charset.Charset;
import java.util.*;
import java.util.stream.Collectors;
//import static org.apache.tika.utils.CharsetUtils.forName;
public class ExportUtils {
    /**
     * 基于poi的方式导出dbf文件
     * @param fileName 文件名
     * @param response HttpServletResponse
     * @param dataList 需要导出的行数据
     * @param headList 需要导出的列数据
     * @throws Exception
     */
    public static void exportPoiToDbf(String fileName, List<List<String>> headList ,List<List<Object>> dataList, HttpServletResponse response) throws IOException {
        try (Workbook workbook = new XSSFWorkbook(); OutputStream out = response.getOutputStream()) {
            Sheet sheet = workbook.createSheet();
            Row rowHeader = sheet.createRow(0);
            for (int i = 0; i < headList.size(); i++) {
                List<String> head = headList.get(i);
                Cell cell = rowHeader.createCell(i, CellType.STRING);
                String headerName = StringUtils.defaultString(head.get(0));
                cell.setCellValue(headerName);
            }
            if (CollectionUtil.isNotEmpty(dataList)) {
                for (int i = 0; i < dataList.size(); i++) {
                    List<Object> data = dataList.get(i);
                    Row rowData = sheet.createRow(i + 1);
                    for (int j = 0; j < data.size(); j++) {
                        Cell cell = rowData.createCell(j);
                        String value = data.get(j) != null ? data.get(j).toString() : "";
                        cell.setCellValue(value);
                    }
                }
            }
            response.setContentType("application/x-dbf");
            response.setHeader("Content-disposition",  "attachment;filename=" + URLEncoder.encode(fileName + ".dbf", "utf-8"));
            workbook.write(out);
        } catch (Exception e) {
            e.printStackTrace();
            // 重置response
            outputErrorJson(response,e.getMessage());
        }
    }
    /**
     * 基于xml的方式导出dbf文件
     * @param fileName 导出的文件名
     * @param response HttpServletResponse
     * @param dataList 需要导出的行数据
     * @param headList 需要导出的列数据
     * @throws Exception
     */
    @SuppressWarnings({ "unchecked", "rawtypes" }) //忽略警告
    public static void exportXmlToDbf(String fileName,List<List<String>> headList,List<List<Object>> dataList, HttpServletResponse response) throws IOException {
        // 创建一个excel应用文件
        StringBuffer sb = new StringBuffer();
        sb.append("<?xml version=\"1.0\"?>");
        sb.append("\n");
        sb.append("<?mso-application progid=\"Excel.Sheet\"?>");
        sb.append("\n");
        sb.append("<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"");
        sb.append("\n");
        sb.append(" xmlns:o=\"urn:schemas-microsoft-com:office:office\"");
        sb.append("\n");
        sb.append(" xmlns:x=\"urn:schemas-microsoft-com:office:excel\"");
        sb.append("\n");
        sb.append(" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"");
        sb.append("\n");
        sb.append(" xmlns:html=\"http://www.w3.org/TR/REC-html40\">");
        sb.append("\n");
        sb.append("<Styles>\n");
        /*设置列头样式*/
        sb.append("<Style ss:ID=\"header\" ss:Name=\"header\">\n");//ss:ID=“header”对应下面的Row ss:StyleID=“header”
        sb.append("<Font ss:FontName=\"Arial\" x:CharSet=\"134\" ss:Bold=\"Bolder\" ss:Size=\"10\"/>\n");//设置字体
        sb.append("</Style>\n");
        /*其它默认样式设置*/
        sb.append("<Style ss:ID=\"Default\" ss:Name=\"Normal\">\n");
        sb.append("<Alignment ss:Vertical=\"Center\"/>\n");
        sb.append("<Font ss:FontName=\"宋体\" x:CharSet=\"134\" ss:Size=\"10\"/>\n");
        sb.append("<Interior/>\n");
        sb.append("<NumberFormat/>\n");
        sb.append("<Protection/>\n");
        sb.append("</Style>\n");
        sb.append("</Styles>\n");
        try {
            // 生成表格
            int headersLength = headList.size();
            sb.append("<Worksheet ss:Name=\"" + "Sheet1" + "\">");
            sb.append("\n");
            sb.append("<Table ss:ExpandedColumnCount=\"" + headersLength
                    + "\" ss:ExpandedRowCount=\"1000000\" x:FullColumns=\"1\" x:FullRows=\"1\">");
            sb.append("\n");
            // 输出列头
            sb.append("<Row>");
            for (int i = 0; i < headersLength; i++) {
                sb.append("<Cell ss:StyleID=\"header\"><Data ss:Type=\"String\">" + headList.get(i).get(0) + "</Data></Cell>");
            }
            sb.append("</Row>");
            // 构建表体数据
            for (int j = 0; j < dataList.size(); j++) {
                sb.append("<Row>");
                for (int i = 0; i < dataList.get(0).size(); i++) {
                    sb.append("<Cell><Data ss:Type=\"String\">");
                    sb.append(String.valueOf(dataList.get(j).get(i)).equals("null")?"":String.valueOf(dataList.get(j).get(i)));
                    sb.append("</Data></Cell>");
                }
                sb.append("</Row>");
                sb.append("\n");
            }
            sb.append("</Table>");
            sb.append("<WorksheetOptions xmlns=\"urn:schemas-microsoft-com:office:excel\">");
            sb.append("\n");
            sb.append("<ProtectObjects>False</ProtectObjects>");
            sb.append("\n");
            sb.append("<ProtectScenarios>False</ProtectScenarios>");
            sb.append("\n");
            sb.append("</WorksheetOptions>");
            sb.append("\n");
            sb.append("</Worksheet>");
            sb.append("</Workbook>");
            sb.append("\n");
            response.setContentType("application/x-dbf;charset=UTF-8");
            response.setHeader("Content-disposition",  "attachment;filename=" + URLEncoder.encode(fileName + ".dbf", "utf-8"));
            response.getOutputStream().write(sb.toString().getBytes());
            response.getOutputStream().flush();
            response.getOutputStream().close();
        } catch (IOException e) {
            e.printStackTrace();
            outputErrorJson(response,e.getMessage());
        }
    }
    /**
     * 基于easyExcel的方式导出dbf文件
     * @param fileName 导出的文件名
     * @param response HttpServletResponse
     * @param dataList 需要导出的行数据
     * @param headList 需要导出的列数据
     * @throws Exception
     */
    public  static void exportEasyExcelToDbf(String fileName,List<List<String>> headList,List<List<Object>> dataList,HttpServletResponse response) throws IOException {
        //导出dbf的话需要将date里的类型转成String类型才能满足上报要求
        List<List<String>> strdataList=new ArrayList<>();
        if (CollectionUtil.isNotEmpty(dataList)){
            strdataList =dataList.stream().map(innerList -> innerList.stream().map(m->m==null? "": String.valueOf(m)).collect(Collectors.toList())).collect(Collectors.toList());
        }
        try {
            response.setContentType("application/x-dbf;charset=UTF-8");
            response.setHeader("Content-disposition",  "attachment;filename=" + URLEncoder.encode(fileName + ".dbf", "utf-8"));
            //设置列名的字体大小
            WriteFont headWriteFont = new WriteFont();
            //设置字体大小为10
            headWriteFont.setFontHeightInPoints((short) 10);
            //取消加粗
            headWriteFont.setBold(false);
            //设置字体为Arial
            headWriteFont.setFontName("Arial");
            //列名单元的风格对象
            WriteCellStyle headWriteCellStyle = new WriteCellStyle();
            headWriteCellStyle.setWriteFont(headWriteFont);
            //设置前景色为白色
//            headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
//            headWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
            //去除列名边框
            headWriteCellStyle.setBorderTop(BorderStyle.NONE);
            headWriteCellStyle.setBorderLeft(BorderStyle.NONE);
            headWriteCellStyle.setBorderRight(BorderStyle.NONE);
            headWriteCellStyle.setBorderBottom(BorderStyle.NONE);
            HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy();
            horizontalCellStyleStrategy.setHeadWriteCellStyle(headWriteCellStyle);
            WriteCellStyle cellStyle=new WriteCellStyle();
            WriteFont cellWriteFont = new WriteFont();
            cellWriteFont.setFontHeightInPoints((short) 10);
            cellWriteFont.setFontName("宋体");
            cellStyle.setWriteFont(cellWriteFont);
            List<WriteCellStyle> writeCellStyleList = new ArrayList<>();
            writeCellStyleList.add(cellStyle);
            horizontalCellStyleStrategy.setContentWriteCellStyleList(writeCellStyleList);
            EasyExcel.write(response.getOutputStream()).registerWriteHandler(horizontalCellStyleStrategy).head(headList).autoCloseStream(Boolean.FALSE).sheet("sheet").doWrite(strdataList);
        } catch (IOException e) {
            e.printStackTrace();
            // 重置response
            outputErrorJson(response,e.getMessage());
        }
    }
    /**
     * 基于javadbf的方式导出dbf文件
     * @param response HttpServletResponse
     * @param dataList 需要导出的行数据
     * @param headList 需要导出的列数据
     * @throws Exception
     */
//    public  static void exportJavaDbfToDbf(String fileName,List<List<String>> headList,List<List<Object>> dataList,HttpServletResponse response) throws IOException {
//        try (OutputStream fos = response.getOutputStream()) {
//            response.setContentType("application/x-dbf");
//            response.setHeader("Content-disposition",  "attachment;filename=" + URLEncoder.encode(fileName + ".dbf", "utf-8"));
//            //先需要设置一下表结构--列名
//            DBFField[] dbfFields = new DBFField[headList.size()];
//            Map<Integer,String> noStrMap= new HashMap<>();
//            for (int i = 0; i < headList.size(); i++) {
//                dbfFields[i] = new DBFField();
//                dbfFields[i].setName(headList.get(i).get(0));
//                // dbf表 字符类型 的字段长度最大不能超过254
//                if (N420DfbEnum.getColumnType(headList.get(i).get(0))!=null){
//                    dbfFields[i].setType(DBFDataType.NUMERIC);
//                    dbfFields[i].setLength(5);
//                    noStrMap.put(i,"F");
//                }else {
//                    dbfFields[i].setType(DBFDataType.CHARACTER);
//                    dbfFields[i].setLength(30);
//                }
//            }
//            Charset defaultCharset = forName("GBK");
//            DBFWriter writer = new DBFWriter(fos, defaultCharset);
//            writer.setFields(dbfFields);
//            //然后一条一条的往里面插数据
//            for (int i = 0; i < dataList.size(); i++) {
//                Object[] rowData = new Object[dataList.get(0).size()];
//                for (int j = 0; j < dataList.get(0).size(); j++) {
//                    if (!noStrMap.containsKey(j)){
//                        rowData[j]=String.valueOf(dataList.get(i).get(j)).equals("null")?"":String.valueOf(dataList.get(i).get(j));
//                    }else {
//                        if (String.valueOf(dataList.get(i).get(j)).equals("null")){
//                            rowData[j]=Float.valueOf(0);
//                        }else {
//                            rowData[j]=Float.valueOf(String.valueOf(dataList.get(i).get(j)));
//                        }
//                    }
//                }
//                writer.addRecord(rowData);
//            }
//            // 写入数据
//            writer.write(fos);
//        } catch (IOException e) {
//            e.printStackTrace();
//            // 重置response
//            outputErrorJson(response,e.getMessage());
//        }
//    }
    /**
     * 这个是通用的easyexcel无对象导出方式,使用这个方式需要调用方法前设置ContentType类型
     * @param fileName 导出的文件名+文件后缀
     * @param response HttpServletResponse
     * @param dataList 需要导出的行数据
     * @param headList 需要导出的列数据
     * @throws Exception
     */
    public static void exportEasyExcel(String fileName, List<List<String>> headList, List<List<Object>> dataList, HttpServletResponse response) throws IOException {
        try {
//            response.setContentType("application/x-dbf;charset=UTF-8");
            response.setHeader("Content-disposition",  "attachment;filename=" + URLEncoder.encode(fileName, "utf-8"));
            //设置列名的字体大小
            WriteFont headWriteFont = new WriteFont();
            //设置字体大小为10
            headWriteFont.setFontHeightInPoints((short) 10);
            //取消加粗
            headWriteFont.setBold(false);
            //设置字体为Arial
            headWriteFont.setFontName("Arial");
            //列名单元的风格对象
            WriteCellStyle headWriteCellStyle = new WriteCellStyle();
            headWriteCellStyle.setWriteFont(headWriteFont);
            //设置前景色为白色
//            headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
//            headWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
            //去除列名边框
            headWriteCellStyle.setBorderTop(BorderStyle.NONE);
            headWriteCellStyle.setBorderLeft(BorderStyle.NONE);
            headWriteCellStyle.setBorderRight(BorderStyle.NONE);
            headWriteCellStyle.setBorderBottom(BorderStyle.NONE);
            HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy();
            horizontalCellStyleStrategy.setHeadWriteCellStyle(headWriteCellStyle);
            WriteCellStyle cellStyle=new WriteCellStyle();
            WriteFont cellWriteFont = new WriteFont();
            cellWriteFont.setFontHeightInPoints((short) 10);
            cellWriteFont.setFontName("宋体");
            cellStyle.setWriteFont(cellWriteFont);
            List<WriteCellStyle> writeCellStyleList = new ArrayList<>();
            writeCellStyleList.add(cellStyle);
            horizontalCellStyleStrategy.setContentWriteCellStyleList(writeCellStyleList);
            EasyExcel.write(response.getOutputStream()).registerWriteHandler(horizontalCellStyleStrategy).head(headList).autoCloseStream(Boolean.FALSE).sheet("sheet").doWrite(dataList);
        } catch (IOException e) {
            e.printStackTrace();
            // 重置response
            outputErrorJson(response,e.getMessage());
        }
    }
    public static void outputErrorJson(HttpServletResponse response,String message) throws IOException {
        response.reset();
        response.setContentType("application/json");
        response.setCharacterEncoding("utf-8");
        Map<String, String> map = MapUtils.newHashMap();
        map.put("status", "failure");
        map.put("message", "下载文件失败" + message);
        response.getWriter().println(JSON.toJSONString(map));
    }
    /**
     * 这个是通用的easyexcel有对象导出方式
     * @param response HttpServletResponse
     * @param type 导出excel后缀类型
     * @param fileName 导出文件名
     * @param clazz 列表中的类型对象
     * @param list 导出列表
     * @throws Exception
     */
    public static <T> void easyExcelObjectToExcel(HttpServletResponse response,String fileName,String type, Class<T> clazz,List<T> list) throws IOException {
        if ("csv".equals(type)){
            response.setContentType("text/csv");
        }else if("dbf".equals(type)){
            response.setContentType("application/x-dbf");
        }else if("xls".equals(type)){
            response.setContentType("application/vnd.ms-excel");
        }else {
            //默认xlsx
            type="xlsx";
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        }
        response.setHeader("Content-disposition",  "attachment;filename=" + URLEncoder.encode(fileName+"."+type, "utf-8"));
        try {
            HorizontalCellStyleStrategy horizontalCellStyleStrategy = setMyCellStyle();
            EasyExcel.write(response.getOutputStream(), clazz).sheet("Sheel1").registerWriteHandler(horizontalCellStyleStrategy).doWrite(list);
        } catch (IOException e) {
            e.printStackTrace();
            outputErrorJson(response, e.getMessage());
        }
    }
    public static HorizontalCellStyleStrategy setMyCellStyle() {
        // 头的策略
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        // 设置表头居中对齐
        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        // 颜色
        headWriteCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
        WriteFont headWriteFont = new WriteFont();
        headWriteFont.setFontHeightInPoints((short) 10);
        // 字体
        headWriteCellStyle.setWriteFont(headWriteFont);
        headWriteCellStyle.setWrapped(true);
        // 内容的策略
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        // 设置内容靠中对齐
        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
        HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
        return horizontalCellStyleStrategy;
    }
    /**
     * 这个是通用的easyPoi有对象导出方式
     * @param response HttpServletResponse
     * @param type 导出excel后缀类型
     * @param fileName 导出文件名
     * @param clazz 列表中的类型对象
     * @param list 导出列表
     * @throws Exception
     */
    public static <T> void easyPoiObjectToExcel(HttpServletResponse response,String fileName, String type, Class<T> clazz, List<T> list) throws IOException {
        if ("csv".equals(type)){
            response.setContentType("text/csv");
        }else if("dbf".equals(type)){
            response.setContentType("application/x-dbf");
        }else if("xls".equals(type)){
            response.setContentType("application/vnd.ms-excel");
        }else {
            //默认xlsx
            type="xlsx";
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        }
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + "." + type, "utf-8"));
        response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
        try {
            ExportParams exportParams = new ExportParams(fileName, "Sheel1");
            exportParams.setStyle(ExcelStylesUtil.class);
            // 生成workbook 并导出
            Workbook workbook = ExcelExportUtil.exportExcel(exportParams, clazz, list);
            //获取sheet对象
            Sheet sheet = workbook.getSheetAt(0);
            //去除窗口冻结
            sheet.createFreezePane(0,0);
            workbook.write(response.getOutputStream());
            workbook.close();
        } catch (IOException e) {
            e.printStackTrace();
            outputErrorJson(response, e.getMessage());
        }
    }
}
本文作者:Weee
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!