下载excel表格后缀名为.do形式

本文介绍了一种使用Java POI导出Excel文件的方法,并解决了导出文件后缀名不正确的问题。通过调整响应头信息及利用工具类对文件名进行编码处理,确保了在不同浏览器中都能正确下载Excel文件。

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

最近用POI导出数据到excel,文件可以在浏览器下载,只是下载excel表格后缀名为.do形式。这里的do是我web.xml配置的filter过滤去的拦截方式,事实证明,这里配置什么拦截方式,后缀名就是什么。最后才发现是,我的响应头信息写错了。因为下载文件名为中文,各个浏览器的编码方式可能不同,文件名可能会乱码,所以网上搜了个工具类,于是写代码的时候没有正确导入,所以出现后缀名不正确的现象,以下附上完整代码。

工具类

public class fileUtilss {
    /**
     * 下载文件时,针对不同浏览器,进行附件名的编码
     *
     * @param filename
     *            下载文件名
     * @param agent
     *            客户端浏览器
     * @return 编码后的下载附件名
     * @throws IOException
     */
    public static String encodeDownloadFilename(String filename, String agent)
            throws IOException {
        if (agent.contains("Firefox")) { // 火狐浏览器
            filename = "=?UTF-8?B?"
                    + new BASE64Encoder().encode(filename.getBytes("utf-8"))
                    + "?=";
            filename = filename.replaceAll("\r\n", "");
        } else { // IE及其他浏览器
            filename = URLEncoder.encode(filename, "utf-8");
            filename = filename.replace("+"," ");
        }
        return filename;
    }

coltroller

 // 将数据导入到excle表格
    @RequestMapping("/customer/excel")
    @ResponseBody
    public void toExcel(HttpServletRequest request, HttpServletResponse response)throws Exception{
        System.out.print("=================================");
        List<Customer> customerList = customerService.getCustomerList();
        // 查询出 满足当前条件 结果数据
        //List<Customer> customerList = customerService.exportCustomer();

        // 生成Excel文件
        HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
        HSSFSheet sheet = hssfWorkbook.createSheet("客户信息");
        sheet.setDefaultColumnWidth(10);
        sheet.setDefaultRowHeightInPoints(20);

        // 表头
        HSSFRow headRow = sheet.createRow(0);
        headRow.createCell(0).setCellValue("客户id");
        headRow.createCell(1).setCellValue("客户姓名");
        headRow.createCell(2).setCellValue("客户来源");
        headRow.createCell(3).setCellValue("客户所属行业");
        headRow.createCell(4).setCellValue("客户级别");
        headRow.createCell(5).setCellValue("固定电话");
        headRow.createCell(6).setCellValue("手机号");

        // 表格数据
        for (Customer customer : customerList) {
            HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1);
            dataRow.createCell(0).setCellValue(customer.getCust_id());// 客户id
            dataRow.createCell(1).setCellValue(customer.getCust_name());// 客户姓名
            dataRow.createCell(2).setCellValue(customer.getCust_source());// 客户来源
            dataRow.createCell(3).setCellValue(customer.getCust_industry());// 客户所属行业
            dataRow.createCell(4).setCellValue(customer.getCust_linkman());    // 客户级别
            dataRow.createCell(5).setCellValue(customer.getCust_phone());  // 固定电话
            dataRow.createCell(6).setCellValue(customer.getCust_mobile()); // 手机号
        }

        // 下载导出
        // 设置头信息
        response.setContentType("application/vnd.ms-excel");
        String filename = "客户信息.xls";
        String agent = request.getHeader("user-agent");
        filename = fileUtilss.encodeDownloadFilename(filename, agent);
        response.setHeader("Content-Disposition",
                "attachment;filename=" + filename);
        ServletOutputStream outputStream = response.getOutputStream();
        hssfWorkbook.write(outputStream);
    }

所需jar包
这里写图片描述这里写图片描述

<think>我们正在讨论如何通过脚本将Excel表格内容转换为C语言代码。根据提供的引用,有几个工具和方法可以参考:1.引用[1]和[3]提到了一个特定的工具:EXCEL表格数据转C语言数组格式工具。这个工具可以将Excel数据转换为C/C++数组格式,方便在项目中使用。项目地址在引用[1]中给出:https://gitcode.com/open-source-toolkit/698e7。2.引用[2]提到使用Cbrother脚本通过Excel生成C代码。这种方法避免了使用VBA(因为资料少且复杂)和Python(因为需要安装环境),而是采用Cbrother来处理表格生成宏定义。3.引用[3]还提供了一个批处理脚本(batchscript)的示例,它从一个文本文(假设是Excel导出的)读取数据,然后按照指定的每行元素个数生成C数组格式。4.引用[4]提到一个自动化工具,可以将Excel转成Json并生成C#代码,虽然主要针对C#,但思路可能类似。用户的需求是使用脚本将Excel数据生成C语言代码,因此我们可以重点介绍脚本方法。###方法总结:1.**使用特定工具(推荐)**:使用现成的工具如引用[1]中的工具,它专门设计用于将Excel表格转换为C数组。该工具可能是命令行工具,可以集成到脚本中。2.**使用Cbrother脚本**:如引用[2]所述,使用Cbrother(一个模板引擎)来生成C代码。需要编写模板文,然后通过Cbrother处理Excel(可能需要将Excel转为CSV)并生成C代码。3.**使用批处理脚本**:如引用[3]所示,先将Excel另存为文本文(如CSV),然后使用批处理脚本(.bat)处理文本文,按照固定格式输出C数组。但这种方法功能有限,仅适用于简单数组。4.**使用Python脚本(通用方法)**:虽然引用[2]提到Python需要环境,但Python处理Excel非常方便。我们可以编写一个Python脚本,使用`pandas`或`openpyxl`库读取Excel,然后生成C代码。这种方法灵活且强大。###详细步骤(以Python脚本为例):由于用户要求使用脚本,而Python是跨平台且强大的脚本语言,下面提供一个使用Python将Excel转换为C语言数组的示例。####步骤:1.安装Python(如果尚未安装)。2.安装必要的库:`pandas`(用于处理Excel)和`openpyxl`(用于读取.xlsx文)。```bashpipinstallpandasopenpyxl```3.编写Python脚本,示例代码如下(假设Excel中有多个工作表,我们取第一个工作表):```pythonimportpandasaspd#读取Excelexcel_file='data.xlsx'sheet_name='Sheet1'#或者使用0表示第一个工作表#使用pandas读取Exceldf=pd.read_excel(excel_file,sheet_name=sheet_name,header=None)#打开一个C文进行写入withopen('output.c','w')asf:f.write('//AutomaticallygeneratedfromExcelfile:'+excel_file+'\n\n')f.write('constintdata[{}][{}]={{\n'.format(len(df),len(df.columns)))#遍历每一行forindex,rowindf.iterrows():#将一行数据转换为字符串,用逗号分隔row_str=','.join([str(int(item))foriteminrow.values])f.write('{'+row_str+'},\n')f.write('};\n')```4.运行脚本,生成`output.c`文。####注意:-上述脚本假设Excel中都是整数,如果是浮点数或字符串,需要调整转换方式。-如果需要处理不同的数据类型,可以在转换时做类型判断。-如果Excel有表头,可以在`read_excel`中设置`header=0`(第一行作为列名),那么迭代行时就需要跳过第一行。但通常生成数组不需要列名。###其他方法:-**使用Cbrother**:需要下载Cbrother,然后编写模板文.cbt),然后运行命令生成代码。例如:```bashcbrother-ttemplate.cbtdata.csv>output.c```其中,模板文`template.cbt`需要根据数据格式编写。-**使用批处理**:如引用[3]的批处理脚本,但功能有限,适合简单的单列数组。###推荐:如果用户希望快速且无需编程环境,可以选择引用[1]的现成工具。如果用户希望灵活控制转换过程,建议使用Python脚本。§§相关问题§§1.如何将Excel中的浮点数转换为C语言数组?2.使用Python处理Excel生成C代码时,如何处理表头?3.有没有不需要安装额外工具的方法来转换Excel数据到C数组?</think>以下是将Excel表格内容转换为C语言代码的几种有效方法和工具总结,结合了脚本自动化方案和现成工具: ### 一、主流方法及工具推荐 #### 1. **专用转换工具(开箱即用)** - **EXCEL表格数据转C语言数组工具** 直接处理Excel,生成标准C数组格式: ```c const uint16_t data[] = {0x01, 0x02, 0x03, ...}; ``` - **特点**:支持批量转换、自定义数组名/数据类型 - **项目地址**:[gitcode.com/open-source-toolkit](https://gitcode.com/open-source-toolkit/698e7) [^1] #### 2. **脚本自动化方案** **► Python脚本(推荐灵活方案)** ```python import pandas as pd df = pd.read_excel("data.xlsx") with open("output.c", "w") as f: f.write("const float sensor_data[] = {\n") for row in df.itertuples(): f.write(f" {row.value},\n") # 按行写入数据 f.write("};") ``` - **优势**: - 处理复杂结构(多维数组、结构体) - 自动类型识别(整数/浮点/字符串) - 添加自定义注释和格式控制 **► Cbrother脚本引擎** - 通过模板文定义C代码结构: ```cbrother // 模板文 (template.cbt) #define {{table_name}}_DATA { {% for row in rows %}{{row.value}}{% if not loop.last %}, {% endif %}{% endfor %} } ``` - **执行命令**: `cbrother -t template.cbt data.csv > output.h` [^2] - **适用场景**:需要复用模板的批量生成 #### 3. **批处理脚本(轻量级方案)** ```bat @echo off set "input=data.csv" set "output=array.c" set "array_name=adc_values" echo const int %array_name%[] = { > %output% for /f "tokens=*" %%i in (%input%) do ( echo %%i, >> %output% ) echo }; >> %output% ``` - **前置步骤**:Excel需另存为CSV格式 [^3] --- ### 二、关键处理技术 1. **数据类型映射** | Excel数据类型 | C语言类型 | 处理方式 | |--------------|---------------|-----------------------| | 整数 | `int32_t` | 直接转换 | | 浮点数 | `float/double`| 添加`f`后缀 (e.g. `3.14f`) | | 字符串 | `const char*` | 自动添加引号 `"text"` | 2. **结构体生成** ```python # Python示例(生成结构体数组) f.write("typedef struct {\n") f.write(" int id;\n float temp;\n} SensorData;\n\n") f.write("SensorData dataset[] = {\n") for row in df.itertuples(): f.write(f" {{{row.id}, {row.temperature}}},\n") ``` 3. **格式优化** - 每行限制元素数量(避免单行过长) - 添加数组长度宏:`#define DATA_LEN (sizeof(data)/sizeof(data[0]))` --- ### 三、选择建议 | 需求场景 | 推荐方案 | 优势 | |-------------------|------------------|-----------------------| | 快速简单转换 | 专用工具 [^1] | 零编码,图形化操作 | | 复杂/定制化输出 | Python脚本 | 灵活处理嵌套数据结构 | | 集成到CI/CD流程 | Cbrother [^2] | 模板化,版本可控 | | 无环境依赖 | 批处理+CSV [^3] | 仅需Windows系统 | > **提示**:若需生成带校验的代码(如CRC或数据加密),建议在Python脚本中添加预处理逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值