【Java】-【XSSFWorkBook解析.xlsx的excel】

news/2024/7/21 7:07:48 标签: excel, java, 开发语言

在POI中提供了Excel文件的两种实现类,HSSFWrorBook和XSSFWorkBook,前者适用于Excel文件的老版本,后缀名为“.xls”,而后者适用于后缀名为“.xlsx”。

excel_1">解析excel

创建WookBook类的实例化对象

创建一个WookBook类的实例化对象,与此同时创建输入流对文件进行文件的读取,按照文件的结构逐层读取。

java">//方式1
try (Workbook workbook = new XSSFWorkbook();
	FileInputStream in = new FileInputStream("D:\\test\\1627356552686.xlsx")) {
} catch (IOException e) {
	e.printStackTrace();
}
try (//方式2 通过匿名子类
	Workbook workbook1 = new XSSFWorkbook(new FileInputStream("D:\\test\\1627356552686.xlsx"))) {
} catch (IOException e) {
	e.printStackTrace();
}

获取工作簿

java">//根据名称获取
Sheet sheet = workbook.getSheet("yyyy");
//根据下标获取第一个工作簿
Sheet sheet = workbook.getSheetAt(0);

获取当前工作簿中的数据行

java">//遍历所有行
for(Row row : sheet) {
    System.out.println(row);
}
 
//遍历部分行
// sheet.getLastRowNum():总行数
for (int i = 0; i < sheet.getLastRowNum(); i++) {
    Row row = sheet.getRow(i);
    System.out.println(row);
}

获取当前行的每个单元格

java">Cell cell = row.getCell(0); //得到第一个单元格
cell.getNumericCellValue() //得到第一个单元格的内容
// 也可以使用foreach进行单元格的遍历
for(Cell cell : row) {

}

excel_47">写入excel

创建WookBook类的实例化对象

同前述

创建工作簿

java">Sheet sheet1 = workbook.createSheet();
//也可以自定义工作簿名称
Sheet sheet2 = workbook.createSheet("y");

创建数据行

java">Row row = sheet.createRow(0);  //创建当前工作簿的第一行

创建单元格并且写入内容

java">Cell cell = row.createCell(0); //创建第一个单元格
//设置当前单元格的内容
cell.setCellValue(UUID.randomUUID().toString());

设置单元格格式

java">// 创建单元格样式
DataFormat dataFormat = workbook.createDataFormat();
Short formatCode = dataFormat.getFormat("yyyy-MM-dd HH:mm:ss");
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setDataFormat(formatCode);
// 为当前行创建单元格
Cell cell1 = row.createCell(1);
cell1.setCellStyle(cellStyle); // 设置单元格样式
cell1.setCellValue(new Date()); // 保存当前日期时间至本单元格
//设置单元格的水平对齐类型。 此时水平居中
cellStyle.setAlignment(HorizontalAlignment.CENTER);

// 设置单元格的垂直对齐类型。 此时垂直靠底边
cellStyle.setVerticalAlignment(VerticalAlignment.BOTTOM);

excel_84">写入excel文件

使用的是WorkBook对象的write!

java"> workbook.write(out);

写入范例

java">public static void downloadImportTemplate() throws Exception {
    String fileName = “xx”
    File fileTemplate = new File(fileName);
    FileInputStream is = new FileInputStream(fileTemplate);
    XSSFWorkbook workbook = new XSSFWorkbook(is);
    XSSFSheet sheet = workbook.getSheetAt(0);// 获取第1个工作簿
    XSSFRow row0 = sheet.createRow(0);// 创建第1行
    XSSFFont cellFont = workbook.createFont();// 创建样式
    cellFont.setFamily(FontFamily.DECORATIVE);
    XSSFDataFormat df = workbook.createDataFormat();
    cellFont.setColor((short)32767);
    XSSFCellStyle teamCellStyle = workbook.createCellStyle();
    teamCellStyle.setAlignment(HorizontalAlignment.CENTER);
    teamCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
    teamCellStyle.setDataFormat(df.getFormat("@"));
    teamCellStyle.setFillForegroundColor(new XSSFColor(new Color(236, 238, 238)));
    teamCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
    teamCellStyle.setBorderTop(BorderStyle.THIN);
    teamCellStyle.setBorderBottom(BorderStyle.THIN);
    teamCellStyle.setBorderRight(BorderStyle.THIN);
    XSSFCell cell = row0.createCell(0);// 创建第1行的第1列
    cell.setCellStyle(teamCellStyle);// 为单元格设置样式
    cell.setCellValue(new XSSFRichTextString("aa"));// 设置第1行第1列的内容
// 后面每1行每1列都像前3行那样写,此处不再赘述
    workbook.write(out);// excel写入workbook
   out.flush();
    out.close();
    return null;
 }

问题

在开发过程中,Workbook workbook1 = new XSSFWorkbook(new FileInputStream("D:\\test\\1627356552686.xlsx"))报错:

org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)

这是由于 excel 版本问题,我们使用了解析 2003版excel (.xls)的方法来解析 2007版的 excel (.xlsx)后抛出的异常。既然解析需要根据 excel版本 而使用不同的 对象,那我们直接根据文件后缀做个判断就好,例如:

java">		//获得原始文件名
        String oriName = myfile.getOriginalFilename();
		if (oriName.endsWith("xls")) {
			//使用 HSSFWorkbook 解析
		} else {
			//使用 XSSFWorkbook 解析
		}

WorkbookFactory.create() 函数中的源码如下:

java">/**
	 * Creates the appropriate HSSFWorkbook / XSSFWorkbook from
	 *  the given InputStream.
	 * Your input stream MUST either support mark/reset, or
	 *  be wrapped as a {@link PushbackInputStream}!
	 */
	public static Workbook create(InputStream inp) throws IOException, InvalidFormatException {
		// If clearly doesn't do mark/reset, wrap up
		if(! inp.markSupported()) {
			inp = new PushbackInputStream(inp, 8);
		}
		
		if(POIFSFileSystem.hasPOIFSHeader(inp)) {
			return new HSSFWorkbook(inp);
		}
		if(POIXMLDocument.hasOOXMLHeader(inp)) {
			return new XSSFWorkbook(OPCPackage.open(inp));
		}
		throw new IllegalArgumentException("Your InputStream was neither an OLE2 stream, nor an OOXML stream");
	}

因为HSSFWorkbook和XSSFWorkbook都实现了Workbook接口,WorkbookFactory.create()函数里面,对当前传入的excel文件流进行了版本判断,并根据不同的版本,返回不同的Workbook对象。所以可以使用poi-ooxml中的WorkbookFactory.create(inputStream)来创建Workbook。


http://www.niftyadmin.cn/n/266093.html

相关文章

Vue+Openlayers+proj4实现坐标系转换

场景 Vue中使用Openlayers加载Geoserver发布的TileWMS&#xff1a; Vue中使用Openlayers加载Geoserver发布的TileWMS_霸道流氓气质的博客-CSDN博客 在上面的基础上实现不同坐标系坐标数据的转换。 Openlayers中默认的坐标系是EPSG:900913 EPSG:900913等效于EPSG:3857 可在…

Java关键字之:this

一、this关键字的使用 1、this可以用来修饰、调用&#xff1a;属性、方法、构造器 2、this修饰属性和方法 this理解为&#xff1a;当前对象 或 当前正在创建的对象 在类的方法中。我们可以使用“this.属性"或”this.方法“的方式。调用当前对象属性或者方法。但是&#…

【爆肝更新】第二章:Python基础语法——保姆级,超万字!

这一章我们开始学习Python的基础语法&#xff0c;包含字面量&#xff0c;运算符&#xff0c;变量&#xff0c;字符串格式化&#xff0c;input函数等&#xff0c;这一章是为整个Python体系学习打好基础&#xff0c;所以一定要重视起来。 习惯看视频的同学可以看这个免费教程&am…

mysql - 对话chatgpt

1 QSqlDatabase open fail 如果您在尝试连接Qt中的数据库时遇到“QSqlDatabase open fail”错误,这意味着连接到数据库失败了。这个错误可能是由于多种原因导致的,包括: 数据库连接参数不正确 数据库服务器未正确配置或未运行 防火墙或安全软件阻止了数据库连接 缺少正确的…

程序员如何提高代码能力?

前言 作为一名程序员&#xff0c;自己的本质工作就是做程序开发&#xff0c;那么程序开发的时候最直接的体现就是代码&#xff0c;检验一个程序员技术水平的一个核心环节就是开发时候的代码能力。众所周知&#xff0c;程序开发的水平提升是一个循序渐进的过程&#xff0c;每一位…

红海云CEO孙伟解密智能化人力资源新范式

4月25日&#xff0c;由广州人力资源服务协会联合HRflag主办的“2023广州人力资源创新与科技展”在广州越秀国际会议中心举办&#xff0c;大会邀请红海云CEO孙伟出席并发表主题演讲&#xff0c;分享人力资源数字化的创新&#xff0c;实践以及思考。 红海云持续高增长的密码 在…

PyCharm更换pip源、模块安装、PyCharm依赖包导入导出

一、Pycharm更换安装源 在下载安装好Pycharm后&#xff0c;一个在实际编程开发过程中非常重要的问题是第三方库添加&#xff0c;然而Python默认的源网络速度有点慢&#xff0c;因此&#xff0c;我们常常需要做的是更换Pycharm的安装源。 在当前最新版&#xff08;2022.03版&…

信号完整性分析基础知识之传输线和反射(三):仿真和测试反射波形

使用上面反射系数的定义&#xff0c;可以计算来自任意阻抗的反射信号。当终端阻抗为阻性元件时&#xff0c;阻抗恒定&#xff0c;反射电压容易计算。当终端具有更复杂的阻抗行为&#xff08;例如电容性或电感性终端&#xff0c;或两者的某种组合&#xff09;时&#xff0c;如果…