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文件时产生的:
产生的原因是:excel是从网页下载或者其他第三方软件导出的,所以它的后缀名虽然是xsl,但是它文件头签名仍然是原来的格式,poi不能识别,也不能读取它
解决方法:使用excel打开,另存为2003版的excel,重新运行代码
另外运行代码时,文件不能打开,否则会报错;
此外设置单元格的列宽有bug,一般会精度差异,原因可能是excel的方法问题
excel 2003 支持的最大列数:256,行数:65535
导入代码正在写,未完待续。。。。。。。。
上一篇: Java导出Excel工具类
下一篇: Java导出Excel工具类