欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Invalid header signature异常,使用POI导出到Excel

程序员文章站 2024-02-24 13:31:52
...

在pom.xml中导入依赖,excel导入导出通用依赖,导入需要先做好文件上传;

<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi</artifactId>
  <version>4.1.2</version>
  <exclusions>
    <exclusion>
      <artifactId>commons-collections4</artifactId>
      <groupId>org.apache.commons</groupId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi-ooxml</artifactId>
  <version>4.1.2</version>
</dependency>
<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi-ooxml-schemas</artifactId>
  <version>4.1.2</version>
</dependency>
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-collections4</artifactId>
  <version>4.1</version>
</dependency>
<dependency>
  <groupId>commons-collections</groupId>
  <artifactId>commons-collections</artifactId>
  <version>3.2.2</version>
</dependency>
<dependency>
  <groupId>commons-lang</groupId>
  <artifactId>commons-lang</artifactId>
  <version>2.6</version>
</dependency>
<dependency>
  <groupId>commons-beanutils</groupId>
  <artifactId>commons-beanutils</artifactId>
  <version>1.9.3</version>
</dependency>

controller中代码:

          
        //给tHead准备数据
        String str[] = {"厂家全称","简称","联系人","联系电话","手机","传真"};

        //创建工作簿,低版本的xls
        File file = new File("D:\\factory.xls");
        //如果文件不存在,创建一个文件
        if(!file.exists()){
            file.createNewFile();
        }
        HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(file));
        //创建工作表sheet
        HSSFSheet sheet = wb.createSheet();

        //行与列的初始值
        int row = 0;
        int col = 0;
       //样式工具类,部分样式封装到了工具类中
        HSSFCellStyle title = PoiUtil.title(wb,sheet);
        //创建标题行对象
        HSSFRow r = sheet.createRow(row);//起始行为0
        r.setHeightInPoints(28);//标题设置行高
        //创建标题
            /*创建单元格对象
                HSSFCell c = r.createCell(1);//第二列
                c.setCellValue("生产厂家信息表!");//设置单元格内容
                c.setCellStyle(tBody);//设置单元格对象*/
         createCell(r,col,"生产厂家信息表",title);
        
        //创建tHead行对象
        r = sheet.createRow(++row);
        r.setHeightInPoints(24);//设置行高
        HSSFCellStyle body = PoiUtil.tHead(wb);//样式工具类,部分样式封装到了工具类中
        for(int i = 0;i<str.length;i++){
            createCell(r, col++, str[i], body);//行对象,列(使用完后将列的初始值重新设为0),tHead的数据,样式
        }

        OutputStream os = new FileOutputStream(file);
        wb.write(os);//写入到文件中
        os.flush();//清空缓存
        os.close();//关闭

        

工具类中的样式代码:

 public static HSSFCellStyle title(HSSFWorkbook wb, HSSFSheet sheet){
        //合并单元格
        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 5));//起始行,结束行,起始列,结束列

        //设置单元格宽度
        sheet.setColumnWidth(0, 30*256);//第一列单元格的宽度
        sheet.setColumnWidth(1, 20*256);//第二列单元格的宽度
        sheet.setColumnWidth(2, 20*256);//第三列单元格的宽度
        sheet.setColumnWidth(3, 20*256);//第四列单元格的宽度
        sheet.setColumnWidth(4, 20*256);//第五列单元格的宽度
        sheet.setColumnWidth(5, 20*256);//第六列单元格的宽度
        //创建表头单元格样式对象
        HSSFCellStyle cellStyle = wb.createCellStyle();
        cellStyle.setAlignment(HorizontalAlignment.CENTER);//居中
        HSSFFont font = wb.createFont();//创建字体对象
        font.setFontName("华文彩云");//设置字体样式
        font.setFontHeightInPoints((short)22);//设置字体大小
        cellStyle.setFont(font);
        return cellStyle;
    }

    public static HSSFCellStyle tHead(HSSFWorkbook wb){
        //创建表头单元格样式对象
        HSSFCellStyle cellStyle = wb.createCellStyle();
        cellStyle.setAlignment(HorizontalAlignment.CENTER);//居中
        HSSFFont font = wb.createFont();//创建字体对象
        font.setFontName("华文彩云");//设置字体样式
        font.setFontHeightInPoints((short)18);//设置字体大小
        cellStyle.setFont(font);
        //单元格边框样式
        cellStyle.setBorderTop(BorderStyle.MEDIUM);
        cellStyle.setBorderBottom(BorderStyle.MEDIUM);
        cellStyle.setBorderLeft(BorderStyle.MEDIUM);
        cellStyle.setBorderRight(BorderStyle.MEDIUM);
        return cellStyle;
    }

以上代码最终运行效果:

Invalid header signature异常,使用POI导出到Excel

另查询数据库,查出数据按以上步骤进行处理即可,代码类似!!

我使用期间报了:Invalid header signature异常,这个问题是在使用poi导入excel文件时产生的:

产生的原因是:excel是从网页下载或者其他第三方软件导出的,所以它的后缀名虽然是xsl,但是它文件头签名仍然是原来的格式,poi不能识别,也不能读取它

解决方法:使用excel打开,另存为2003版的excel,重新运行代码

Invalid header signature异常,使用POI导出到Excel

另外运行代码时,文件不能打开,否则会报错;

此外设置单元格的列宽有bug,一般会精度差异,原因可能是excel的方法问题

excel 2003 支持的最大列数:256,行数:65535

导入代码正在写,未完待续。。。。。。。。

 

 

相关标签: java