java-导出数据到excle表格(动态表头和静态表头)

本文详细介绍了一种基于Java的动态生成Excel表头的方法,适用于需要根据设备类型动态调整列数和列名的场景,同时也提供了静态表头的实现方式。通过实例展示了如何从数据库查询数据并将其格式化为Excel表格,支持中文和英文语言选项。

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

两种类型(1.动态生成列数和列名 2.自定义列名)
1.动态表头(把需要的实体类换成自己的就行了)

@RequestMapping(value = “/historyExport”)
public String historyExport(HttpServletResponse response, String ncode, String from, String to, HttpServletRequest request) throws IOException {

    if (StringUtils.isBlank(ncode)) {
        log.error("设备号为空");
        return "redirect:../index";
    }
    if (StringUtils.isBlank(from)) {
        log.error("起始时间为空");
        return "redirect:../index";
    }
    if (StringUtils.isBlank(to)) {
        log.error("结束时间为空");
        return "redirect:../index";
    }
    //验证设备是否属于用户。
    SysUserBean user = ControllerHelper.getInstance(dao).getLoginUser();
    if (user == null) {
        log.error("用户未登录");
        return "redirect:../doLogin";
    }
    if (user.getLevel() > 0) {
        UserDeviceBean bean = dao.fetch(UserDeviceBean.class, Cnd.where("user_name", "=", user.getUserName()).and("ncode", "=", ncode).and("is_del", "=", "0"));
        if (bean == null) {
            throw new ServiceException("权限不足");
        }
    }

    Timestamp fromTime = Timestamp.valueOf(from);
    Timestamp toTime = Timestamp.valueOf(to);
    Timestamp timestamp = new Timestamp(System.currentTimeMillis() - (6 * 30 * 24 * 60 * 60 * 1000l));
    DeviceBean deviceBean = dao.fetch(DeviceBean.class, ncode);
    if (deviceBean == null) {
        throw new ServiceException("设备不存在");
    }
    if (fromTime.getTime() < timestamp.getTime()) {
        fromTime = timestamp;
    }
    if (deviceBean.getCreatTime() != null && fromTime.getTime() < deviceBean.getCreatTime().getTime()) {
        fromTime = deviceBean.getCreatTime();
    }
    Condition cnd = Cnd.where("Drecord_time", ">", fromTime).and("Drecord_time", "<", toTime).and("Dcode", "=", ncode).desc("Did");
    List<NetDevicedata> list = SplitTableHelper.queryForDate(NetDevicedata.class, cnd, fromTime, toTime, 1, 50000);

// Sql sql = Sqls.create(“SELECT a.Nname,a.Ncode,a.Nserson_type,b.dsensor_data Nsensor_data,b.drecord_time Nrecord_time FROM netdevicedata b,network a where b.drecord_time>= @from and b.drecord_time<= @to and a.ncode=b.dcode and a.ncode=@ncode”);
// sql.params().set(“from”, fromtime);
// sql.params().set(“to”, totime);
// sql.params().set(“ncode”, ncode);
// this.sqlCallBack(sql);
// dao.execute(sql);
// List list = sql.getList(DeviceBean.class);
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet(ncode + “历史数据”);
String fileName = ncode + “历史数据”;//设置要导出的文件的名字
//新增数据行,并且设置单元格数据
int rowNum = 1;

    Cookie[] cookies = request.getCookies();
    String language = "";
    if (cookies != null) {
        for (Cookie cookie : cookies) {
            String name = cookie.getName();
            if (Constant.COOKIE_LANG.equals(name)) {
                language = cookie.getValue();
                break;
            }
        }
    }

    int headerCount = 4;
    String[] typeArr = {};
    if (!StringUtils.isEmpty(deviceBean.getType())) {
        typeArr = deviceBean.getType().split("/");
        headerCount += typeArr.length * 2;
    }

    String[] headers = new String[headerCount];
    if (language.equals("en")) {
        headers[0] = "Number";
        headers[1] = "Device Name";
        headers[2] = "Device Number";
        headers[3] = "Receive Time";
        int j = 0;
        try {
            for (int i = 4; i < headers.length; i += 2) {
                if (j < typeArr.length) {
                    String enHeader = "";
                    SensorTypeBean sensorTypeBean = dao.fetch(SensorTypeBean.class, Cnd.where("tname", "=", typeArr[j].trim()));
                    if (sensorTypeBean != null) {
                        if (StringUtils.isBlank(sensorTypeBean.getEnName())) {
                            enHeader = getEnHeaderStr(typeArr[j].trim());
                            sensorTypeBean.setEnName(enHeader);
                            dao.update(sensorTypeBean);
                        } else {
                            enHeader = sensorTypeBean.getEnName();
                        }
                    } else {
                        enHeader = getEnHeaderStr(typeArr[j].trim());
                    }

                    headers[i] = enHeader;
                    headers[i + 1] = "unit";
                    j++;
                }
            }
        } catch (Exception e) {
            log.warn(e.getMessage());
        }
    } else {
        headers[0] = "序号";
        headers[1] = "设备名称";
        headers[2] = "设备编号";
        headers[3] = "接收时间";
        int j = 0;
        for (int i = 4; i < headers.length; i += 2) {
            if (j < typeArr.length) {
                headers[i] = typeArr[j];
                headers[i + 1] = "单位";
                j++;
            }
        }
    }
    //headers表示excel表中第一行的表头
    HSSFRow row = sheet.createRow(0);
    //在excel表中添加表头
    for (int i = 0; i < headers.length; i++) {
        HSSFCell cell = row.createCell(i);
        HSSFRichTextString text = new HSSFRichTextString(headers[i]);
        cell.setCellValue(text);
        cell.getCellStyle().setAlignment(HorizontalAlignment.CENTER);
        switch (i) {
            case 1:
                cell.getSheet().setColumnWidth(i, 5000);
                break;
            case 2:
                cell.getSheet().setColumnWidth(i, 5000);
                break;
            default:
                cell.getSheet().setColumnWidth(i, 3000);
        }
    }

    //在表中存放查询到的数据放入对应的列
    for (NetDevicedata netDevicedata : list) {
        HSSFRow row1 = sheet.createRow(rowNum);
        String time = netDevicedata.getDrecordTime().toString();
        row1.createCell(0).setCellValue(rowNum);
        row1.createCell(1).setCellValue(deviceBean.getName());
        row1.createCell(2).setCellValue(netDevicedata.getDeviceNumber());
        row1.createCell(3).setCellValue(time.substring(0, time.lastIndexOf(".")));

        String[] datas = {};
        if (!StringUtils.isEmpty(deviceBean.getType())) {
            datas = netDevicedata.getSensorData().split("\\|");

            int j = 0;
            for (int i = 4; i < headers.length; i += 2) {
                if (j < typeArr.length) {
                    try {//改模越界问题
                        String[] datasStr = datas[j].trim().split("\\s+");
                        row1.createCell(i).setCellValue(datasStr[0]);
                        if (datasStr.length < 2) {
                            if (language.equals("zh")) {
                                row1.createCell(i + 1).setCellValue("无");
                            } else {
                                row1.createCell(i + 1).setCellValue("none");
                            }
                        } else {
                            row1.createCell(i + 1).setCellValue(datasStr[1]);
                        }
                    } catch (Exception e) {

// log.info(e.toString(),e);
}
j++;
}
}
}
rowNum++;
}
response.setCharacterEncoding(“UTF-8”);
response.setContentType(“application/octet-stream”);
response.setHeader(“Content-disposition”, “attachment;filename=” + new String(fileName.getBytes(“gbk”), “iso8859-1”) + “.xls”);
//response.setHeader(“Content-disposition”, “attachment;filename=” + fileName);
response.flushBuffer();
workbook.write(response.getOutputStream());

    return null;
}

private String getEnHeaderStr(String cnHeaderStr) throws Exception {

    String enHeader = TranslationUtils.getTranslationStr(cnHeaderStr);
    if (StringUtils.isBlank(enHeader)) {
        return cnHeaderStr;
    }
    return enHeader;
}

public static String getAnalysisData(String type, String value) {

    if (StringUtils.isEmpty(value)) {
        return "";
    }
    String[] types = {};
    if (!StringUtils.isEmpty(type)) {
        types = type.split("/");
    }
    String[] datas = value.split("\\|");
    String data = "";
    for (int j = 0; j < datas.length; j++) {
        if (types.length > j) {
            data += types[j].replace(" ", "") + "·" + datas[j].replace(" ", "");
        } else {
            data += datas[j];
        }
        if (j < datas.length - 1) {
            data += " | ";
        }
    }
    return data;
}
效果图
![效果图](https://img-blog.csdnimg.cn/20200810112513924.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0dvZFN1cmUwOTE0,size_16,color_FFFFFF,t_70)


静态表头,这个就比较简单了,需要几列自己设置
    @RequestMapping(value = "/historyExport")
    @ResponseBody
    public String historyExport(HttpServletResponse response, HttpServletRequest request) throws IOException {


        //验证设备是否属于用户。
        SysUserBean user = ControllerHelper.getInstance(dao).getLoginUser();
        if (user == null) {
            log.error("用户未登录");
            return "redirect:../doLogin";
        }
     List<DeviceBean> deviceList=new ArrayList<>();
        List<UserDeviceBean> list1 = dao.query(UserDeviceBean.class, Cnd.where("user_name", "=", user.getUserName()).and("is_del", "=", "0"));
        for (int i=0;i<list1.size();i++){
            DeviceBean deviceBean=dao.fetch(DeviceBean.class,Cnd.where("Ncode","=",list1.get(i).getDeviceNumber()));
            if (null!=deviceBean){
                deviceList.add(deviceBean);
            }
        }

//        Sql sql = Sqls.create("SELECT a.Nname,a.Ncode,a.Nserson_type,b.dsensor_data Nsensor_data,b.drecord_time Nrecord_time FROM netdevicedata b,network a where  b.drecord_time>= @from and b.drecord_time<= @to and a.ncode=b.dcode and a.ncode=@ncode");
//        sql.params().set("from", fromtime);
//        sql.params().set("to", totime);
//        sql.params().set("ncode", ncode);
//        this.sqlCallBack(sql);
//        dao.execute(sql);
//        List<DeviceBean> list = sql.getList(DeviceBean.class);
        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet sheet = workbook.createSheet(user.getUserName() + "用户设备历史数据");
        String fileName = user.getUserName() + "设备数据";//设置要导出的文件的名字
        //新增数据行,并且设置单元格数据
        int rowNum = 1;

        Cookie[] cookies = request.getCookies();
        String language = "";
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                if (Constant.COOKIE_LANG.equals(name)) {
                    language = cookie.getValue();
                    break;
                }
            }
        }

        int headerCount = 1;
        String typeArr = "";
        if (null!=(deviceList)) {
            for (DeviceBean deviceBean:deviceList){
                typeArr = deviceBean.getType();
            }

        }

        String[] headers = new String[6];
        if (language.equals("en")) {
            headers[0] = "Number";
            headers[1] = "Device Name";
            headers[2] = "Device Number";
            headers[3] = "Receive Time";
            headers[4] = "Receive Data";
            headers[5] = "unit";


        } else {
            headers[0] = "序号";
            headers[1] = "设备名称";
            headers[2] = "设备编号";
            headers[3] = "接收时间";
            headers[4] = "接收数据";
            headers[5] = "单位";


        }
        //headers表示excel表中第一行的表头
        HSSFRow row = sheet.createRow(0);
        //在excel表中添加表头
        for (int i = 0; i < headers.length; i++) {
            HSSFCell cell = row.createCell(i);
            HSSFRichTextString text = new HSSFRichTextString(headers[i]);
            cell.setCellValue(text);
            cell.getCellStyle().setAlignment(HorizontalAlignment.CENTER);
            switch (i) {
                case 1:
                    cell.getSheet().setColumnWidth(i, 5000);
                    break;
                case 2:
                    cell.getSheet().setColumnWidth(i, 5000);
                    break;
                default:
                    cell.getSheet().setColumnWidth(i, 3000);
            }
        }

        //在表中存放查询到的数据放入对应的列
        for (DeviceBean deviceBean1 : deviceList) {
            HSSFRow row1 = sheet.createRow(rowNum);
            String time = deviceBean1.getTime().toString();
            row1.createCell(0).setCellValue(rowNum);
            row1.createCell(1).setCellValue(deviceBean1.getName());
            row1.createCell(2).setCellValue(deviceBean1.getDeviceNumber());
            row1.createCell(3).setCellValue(time.substring(0, time.lastIndexOf(".")));
            row1.createCell(4).setCellValue(deviceBean1.getData());
            row1.createCell(5).setCellValue(deviceBean1.getType());

            String[] datas = {};

            rowNum++;
        }
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/octet-stream");
        response.setHeader("Content-disposition", "attachment;filename=" + new String(fileName.getBytes("gbk"), "iso8859-1") + ".xls");
        //response.setHeader("Content-disposition", "attachment;filename=" + fileName);
        response.flushBuffer();
        workbook.write(response.getOutputStream());

        return null;
    }
    private String getEnHeaderStr(String cnHeaderStr) throws Exception {

        String enHeader = TranslationUtils.getTranslationStr(cnHeaderStr);
        if (StringUtils.isBlank(enHeader)) {
            return cnHeaderStr;
        }
        return enHeader;
    }

效果图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200810112848478.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0dvZFN1cmUwOTE0,size_16,color_FFFFFF,t_70)

### Java中将TableView数据导出到Excel的实现 在Java中,可以利用Apache POI库来处理Excel文件的操作。通过该库,能够轻松创建、读取修改Excel文档的内容。以下是关于如何将`TableView`中的数据导出到Excel的具体方法以及示例代码。 #### 方法概述 为了完成这一功能,通常会采用以下流程: 1. 创建一个新的工作簿(Workbook)实例。 2. 添加一个工作表(Sheet),用于存储数据。 3. 遍历`TableView`中的每一行数据,并将其写入到Excel的工作表中。 4. 将生成的Excel文件保存到指定路径。 这种方法类似于Qt项目中提到的一种简单粗暴的方式[^1],即直接遍历数据并逐条记录到目标文件中。 #### 示例代码 下面是一个完整的代码示例,展示如何使用Apache POI将`TableView`的数据导出到Excel: ```java import javafx.scene.control.TableView; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileOutputStream; import java.io.IOException; import java.util.Iterator; public class TableViewToExcelExporter { public static void export(TableView<?> tableView, String filePath) throws IOException { Workbook workbook = new XSSFWorkbook(); // 使用XSSF表示xlsx格式 Sheet sheet = workbook.createSheet("Data"); // 获取列名并写入第一行 int colCount = tableView.getColumns().size(); Row headerRow = sheet.createRow(0); for (int i = 0; i < colCount; i++) { Cell cell = headerRow.createCell(i); cell.setCellValue(tableView.getColumns().get(i).getText()); } // 遍历TableView中的数据项 Iterator<?> iterator = tableView.getItems().iterator(); int rowIndex = 1; while (iterator.hasNext()) { Object rowDataObject = iterator.next(); // 假设每行数据实现了toStringArray()方法返回数组形式 String[] rowData = rowDataObject.toStringArray(); Row dataRow = sheet.createRow(rowIndex++); for (int j = 0; j < colCount && j < rowData.length; j++) { Cell cell = dataRow.createCell(j); cell.setCellValue(rowData[j]); } } try (FileOutputStream fileOut = new FileOutputStream(filePath)) { workbook.write(fileOut); // 输出到文件 } finally { workbook.close(); // 关闭资源 } } } ``` 上述代码假设`TableView`中的每一行对象都提供了一个名为`toStringArray()`的方法,用来获取当前行的所有字段值作为字符串数组。如果实际使用的类不支持此方法,则需自行调整逻辑以适配具体需求。 #### 注意事项 - Apache POI依赖需要提前引入到项目中。可以通过Maven或Gradle等方式管理依赖关系。例如,在Maven `pom.xml`中添加如下配置: ```xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.3</version> </dependency> ``` - 如果涉及大量数据操作,建议优化内存占用策略,比如启用SAX解析器或者分批写入文件。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值