poi读取Excel文档(.xls .xlsx)包含合并单元格

article/2025/10/21 3:50:52

例子:

 结果:

开始:-----------------------------------

导入的poi

        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.14</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.14</version></dependency>

判断文件格式初始化

    /*** 读取excel需求格式* @param filePath 路径* @return 返回*/public static Workbook readExcel(String filePath){Workbook wb = null;if(filePath==null){return null;}String extString = filePath.substring(filePath.lastIndexOf("."));InputStream is = null;try {is = new FileInputStream(filePath);if(".xls".equals(extString)){return wb = new HSSFWorkbook(is);}else if(".xlsx".equals(extString)){return wb = new XSSFWorkbook(is);}else{return wb = null;}} catch (Exception e) {error("readExcel--" + e.getMessage());}return wb;}

ExcelUtil完整代码(根据自己的需求进行修改,下面为我已经修改后的代码,代码我自己能够运行,如不能运行,请读一读改一改)

public class ExcelUtil {public static void main(String[] args){ExcelUtil excelUtil = new ExcelUtil();String[] columnNames = {"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21"};//读取excel数据ArrayList<Map<String,String>> result = excelUtil.readExcelToObj("sheet1",columnNames,"C:\\Users\\86182\\Desktop\\aa.xls");for(Map<String,String> map:result){System.out.println("输出:"+map);}}/*** 读取excel需求格式* @param filePath 路径* @return 返回*/public static Workbook readExcel(String filePath){Workbook wb = null;if(filePath==null){return null;}String extString = filePath.substring(filePath.lastIndexOf("."));InputStream is = null;try {is = new FileInputStream(filePath);if(".xls".equals(extString)){return wb = new HSSFWorkbook(is);}else if(".xlsx".equals(extString)){return wb = new XSSFWorkbook(is);}else{return wb = null;}} catch (Exception e) {
//            error("readExcel--" + e.getMessage());}return wb;}/**---------------根据需要自己修改--------------------------------------------------------------------------------------------------------------* 读取excel数据* @param readExcel 传入*/public ArrayList<Map<String,String>> readExcelToObj(String name,Object[] columnNames, Workbook readExcel) {
//        Workbook wb = null;ArrayList<Map<String,String>> result = null;try {
//            wb = WorkbookFactory.create(new File(path));result = readExcel(readExcel, name, 0, 0,columnNames);} catch (Exception e) {e.printStackTrace();}return result;}public ArrayList<Map<String,String>> readExcelToObj(String name,Object[] columnNames, String path) {Workbook wb = null;ArrayList<Map<String,String>> result = null;try {wb = WorkbookFactory.create(new File(path));result = readExcel(wb, name, 0, 0,columnNames);} catch (Exception e) {e.printStackTrace();}return result;}//-----------------------------------------------------------------------------------------------------------------------------/*** 读取excel文件* @param wb* @param sheetIndex sheet页下标:从0开始* @param startReadLine 开始读取的行:从0开始* @param tailLine 去除最后读取的行*/private ArrayList<Map<String,String>> readExcel(Workbook wb,String sheetIndex, int startReadLine, int tailLine,Object[] columnNames) {
//        Sheet sheet = wb.getSheetAt(sheetIndex);Sheet sheet = wb.getSheet(sheetIndex);Row row = null;ArrayList<Map<String,String>> result = new ArrayList<Map<String,String>>();for(int i=startReadLine; i<sheet.getLastRowNum()-tailLine+1; i++) {row = sheet.getRow(i);Map<String,String> map = new HashMap<String,String>();for(Cell c : row) {//全部按照字符串类型来读取c.setCellType(Cell.CELL_TYPE_STRING);String returnStr = "";boolean isMerge = isMergedRegion(sheet, i, c.getColumnIndex());//判断是否具有合并单元格if(isMerge) {String rs = getMergedRegionValue(sheet, row.getRowNum(), c.getColumnIndex());
//                    System.out.print(rs + "------ ");returnStr = rs;}else {
//                    System.out.print(c.getRichStringCellValue()+"++++ ");
//                    c.setCellType(Cell.CELL_TYPE_STRING);
//                    returnStr = c.getRichStringCellValue().getString();returnStr = c.getStringCellValue();}//赋值for (int i1 = 0; i1 < columnNames.length; i1++) {if (c.getColumnIndex() == i1){map.put(String.valueOf(columnNames[i1]),returnStr);}}
/*                if(c.getColumnIndex()==0){map.put(columnNames[0],returnStr);}else if(c.getColumnIndex()==1){map.put("base",returnStr);}else if(c.getColumnIndex()==2){map.put("siteName",returnStr);}else if(c.getColumnIndex()==3){map.put("articleName",returnStr);}else if(c.getColumnIndex()==4){map.put("mediaName",returnStr);}else if(c.getColumnIndex()==5){map.put("mediaUrl",returnStr);}else if(c.getColumnIndex()==6){map.put("newsSource",returnStr);}else if(c.getColumnIndex()==7){map.put("isRecord",returnStr);}else if(c.getColumnIndex()==8){map.put("recordTime",returnStr);}else if(c.getColumnIndex()==9){map.put("remark1",returnStr);}else if(c.getColumnIndex()==10){map.put("remark2",returnStr);}else if(c.getColumnIndex()==11){map.put("remark3",returnStr);}else if(c.getColumnIndex()==12){map.put("remark4",returnStr);}else if(c.getColumnIndex()==13){map.put("remark5",returnStr);}else if(c.getColumnIndex()==14){map.put("remark6",returnStr);}else if(c.getColumnIndex()==15){map.put("remark7",returnStr);}else if(c.getColumnIndex()==16){map.put("mediaUrl9",returnStr);}else if(c.getColumnIndex()==14){map.put("newsSource9",returnStr);}else if(c.getColumnIndex()==18){map.put("isRecord9",returnStr);}else if(c.getColumnIndex()==19){map.put("recordTime9",returnStr);}else if(c.getColumnIndex()==20){map.put("remark19",returnStr);}else if(c.getColumnIndex()==21){map.put("remark29",returnStr);}else if(c.getColumnIndex()==22){map.put("remark39",returnStr);}else if(c.getColumnIndex()==23){map.put("remark49",returnStr);}else if(c.getColumnIndex()==24){map.put("remark59",returnStr);}else if(c.getColumnIndex()==25){map.put("remark69",returnStr);}else if(c.getColumnIndex()==26){map.put("remark79",returnStr);}*/}result.add(map);}return result;}/*** 获取合并单元格的值* @param sheet* @param row* @param column* @return*/public String getMergedRegionValue(Sheet sheet ,int row , int column){int sheetMergeCount = sheet.getNumMergedRegions();for(int i = 0 ; i < sheetMergeCount ; i++){CellRangeAddress ca = sheet.getMergedRegion(i);int firstColumn = ca.getFirstColumn();int lastColumn = ca.getLastColumn();int firstRow = ca.getFirstRow();int lastRow = ca.getLastRow();if(row >= firstRow && row <= lastRow){if(column >= firstColumn && column <= lastColumn){Row fRow = sheet.getRow(firstRow);Cell fCell = fRow.getCell(firstColumn);return getCellValue(fCell) ;}}}return null ;}/*** 判断合并了行* @param sheet* @param row* @param column* @return*/private boolean isMergedRow(Sheet sheet,int row ,int column) {int sheetMergeCount = sheet.getNumMergedRegions();for (int i = 0; i < sheetMergeCount; i++) {CellRangeAddress range = sheet.getMergedRegion(i);int firstColumn = range.getFirstColumn();int lastColumn = range.getLastColumn();int firstRow = range.getFirstRow();int lastRow = range.getLastRow();if(row == firstRow && row == lastRow){if(column >= firstColumn && column <= lastColumn){return true;}}}return false;}/*** 判断指定的单元格是否是合并单元格* @param sheet* @param row 行下标* @param column 列下标* @return*/private boolean isMergedRegion(Sheet sheet,int row ,int column) {int sheetMergeCount = sheet.getNumMergedRegions();for (int i = 0; i < sheetMergeCount; i++) {CellRangeAddress range = sheet.getMergedRegion(i);int firstColumn = range.getFirstColumn();int lastColumn = range.getLastColumn();int firstRow = range.getFirstRow();int lastRow = range.getLastRow();if(row >= firstRow && row <= lastRow){if(column >= firstColumn && column <= lastColumn){return true;}}}return false;}/*** 判断sheet页中是否含有合并单元格* @param sheet* @return*/private boolean hasMerged(Sheet sheet) {return sheet.getNumMergedRegions() > 0 ? true : false;}/*** 合并单元格* @param sheet* @param firstRow 开始行* @param lastRow 结束行* @param firstCol 开始列* @param lastCol 结束列*/private void mergeRegion(Sheet sheet, int firstRow, int lastRow, int firstCol, int lastCol) {sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, firstCol, lastCol));}/*** 获取单元格的值* @param cell* @return*/public String getCellValue(Cell cell){if(cell == null) return "";if(cell.getCellType() == Cell.CELL_TYPE_STRING){return cell.getStringCellValue();}else if(cell.getCellType() == Cell.CELL_TYPE_BOOLEAN){return String.valueOf(cell.getBooleanCellValue());}else if(cell.getCellType() == Cell.CELL_TYPE_FORMULA){return cell.getCellFormula() ;}else if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC){return String.valueOf(cell.getNumericCellValue());}return "";}/*** 从excel读取内容*/public static void readContent(String fileName)  {boolean isE2007 = false;    //判断是否是excel2007格式if(fileName.endsWith("xlsx"))isE2007 = true;try {InputStream input = new FileInputStream(fileName);  //建立输入流Workbook wb  = null;//根据文件格式(2003或者2007)来初始化if(isE2007)wb = new XSSFWorkbook(input);elsewb = new HSSFWorkbook(input);Sheet sheet = wb.getSheetAt(0);     //获得第一个表单Iterator<Row> rows = sheet.rowIterator(); //获得第一个表单的迭代器while (rows.hasNext()) {Row row = rows.next();  //获得行数据
//                System.out.println("Row #" + row.getRowNum());  //获得行号从0开始Iterator<Cell> cells = row.cellIterator();    //获得第一行的迭代器while (cells.hasNext()) {Cell cell = cells.next();System.out.println(cell.getStringCellValue());
//                    System.out.println("Cell #" + cell.getColumnIndex());
//                    switch (cell.getCellType()) {   //根据cell中的类型来输出数据
//                        case HSSFCell.CELL_TYPE_NUMERIC:
//                            System.out.println(cell.getNumericCellValue());
//                            break;
//                        case HSSFCell.CELL_TYPE_STRING:
//                            System.out.println(cell.getStringCellValue());
//                            break;
//                        case HSSFCell.CELL_TYPE_BOOLEAN:
//                            System.out.println(cell.getBooleanCellValue());
//                            break;
//                        case HSSFCell.CELL_TYPE_FORMULA:
//                            System.out.println(cell.getCellFormula());
//                            break;
//                        default:
//                            System.out.println("unsuported sell type======="+cell.getCellType());
//                            break;
//                    }}}} catch (IOException ex) {ex.printStackTrace();}}
}


http://chatgpt.dhexx.cn/article/UfPef2bw.shtml

相关文章

Java教程:使用POI读取excel文档(根据BV1bJ411G7Aw整理)

Java教程&#xff1a;使用POI读取excel文档&#xff08;根据BV1bJ411G7Aw整理&#xff09; 最近公司需要我做一个导出Excel表格的功能&#xff0c;为此来学习一下POI&#xff0c;在这里记录一下学习笔记。B站直接搜BV1bJ411G7Aw就能找到视频。 一、简介 poi如何操作表格 二…

poi读取excel模板,并填充数据

一、POI介绍 Apache POI是Apache软件基金会的开放源码函式库&#xff0c;POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 基本功能&#xff1a; HSSF &#xff0d; 提供读写Microsoft Excel格式档案的功能。 XSSF &#xff0d; 提供读写Microsoft Excel OOXM…

java使用poi操作读取Excel文件

在上代码之前首先说说Excel文件的一些名词 工作区workbook&#xff1a;可以理解为一个Excel文件&#xff0c;比如LinkL.xlsx文件 表sheet&#xff1a;一个.xlsx文件中的不同表 行row&#xff1a;表中的一行数据 单元格cell&#xff1a;每一行中的每一个数据就是单元格 附&…

使用Java通过POI读取EXCEL中的数据

这里有个Excel&#xff0c;怎么使用java读取excel中的数据呢&#xff1f; 文件存放位置&#xff1a; 首先引入poi的jar包 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></…

使用POI读取excel文件内容

1.前言 项目中要求读取excel文件内容&#xff0c;并将其转化为xml格式。常见读取excel文档一般使用POI和JExcelAPI这两个工具。这里我们介绍使用POI实现读取excel文档。 2.代码实例&#xff1a; package edu.sjtu.erplab.poi;import java.io.FileInputStream;import java.io.Fi…

使用POI读取Excel文件

使用POI读取Excel文件 一、前言 用户可以通过上传excel文件&#xff0c;后端通过读取excel文件的内容并将内容写入数据库中以便更好的使用。 本文档使用的excel的工具类既可以读取有合并单元格的文件也可以读取没有合并单元格的文件&#xff0c;并且读取到单元格的数据进行了…

POI读写Excel的基本使用

一、Excel导入导出的应用场景 1、数据导入&#xff1a;减轻录入工作量 2、数据导出&#xff1a;统计信息归档 3、数据传输&#xff1a;异构系统之间数据传输 二、POI简介&#xff08;Apache POI&#xff09; 1、什么是POI Apache POI是Apache软件基金会的开放源码函式库&…

C# 加载DotNetBar组件

C#作为前端的开发软件&#xff0c;使用的人很多&#xff0c;但是原生的C#界面较为简陋&#xff0c;已经不能满足公司级的开发工作了&#xff0c;今天这篇博客的主要内容是讲一下怎么在C#端使用一个可以提升界面美感的第三方控件&#xff0c;DotNetBar 首先去官网下载最新的DotN…

DevComponents.DotNetBar2 美化包使用以及验证教程

使用这个美化包是在别人项目上看到的&#xff0c;遇到一些懵逼问题&#xff0c;不断总结&#xff0c;所以写一下教程 DotNetBar 美化包控件不可编辑问题&#xff1a; 如图&#xff1a; 解决办法&#xff1a; 安装DotNetBar 这个软件&#xff08;有试用版&#xff09;&#xff…

winform DevComponents.DotNetBar2 添加到工具栏方法

当C#项目引入皮肤组件&#xff0c;或其他组件是&#xff0c;发现工具框里面没有引用的组件怎么办&#xff1f; 1.组件的引用 我是把下载好的*.dll组件&#xff0c;复制到项目的\bin\Debug\路径下&#xff0c;然后在项目处右键-->添加引用&#xff0c;这样组件就引入项目了…

DotNetBar控件的多文档界面的实现

DotNetBar是一个不错的DotNET控件套装&#xff0c;原来是一个DLL文件&#xff0c;能够做出很漂亮的界面效果&#xff0c;记得在8.0以前的版本&#xff0c;好像实现多文档界面稍显得麻烦一些&#xff0c;我的Winform框架、WCF框架虽然也提供了这样多文档的界面&#xff0c;不过都…

C#之DotNetBar2使用方法 - itemPanel1

用itemPanel做个按钮菜单&#xff0c;模拟用来操控开关按钮 对象buttonItem1的属性&#xff08;itempanel可以添加的子控件列表对象&#xff0c;根据需要选择&#xff0c;这里用到的Button&#xff09; 可以用控件自带的样式&#xff0c;也可以用代码控制&#xff0c;也可以预先…

winfrom DotNetBar sideNav控件使用问题

sideNav初始UI 在最开始的界面&#xff0c;不知道设置了什么东西&#xff0c;然后没有那个东西 最后又新建了个项目&#xff0c;一个一个对比参数。还是没找到&#xff01;倒是发现几个其他的参数属性 在这里记录下 这是分别对应的是对sideNav的sideNavPanel的折叠 最大化 隐藏…

界面控件DotNetBar for WinForms使用教程:highlight组件使用教程

DotNetBar for WinForms是一个拥有89个组件的用户界面控件套包&#xff0c;用户可以使用Visual Studio 2005-2015轻松地创建专业的用户界面。十多年来DotNetBar帮助开发人员轻松地创建易用的专业Windows Forms (WinForms) 用户界面。DotNetBar是全世界第一个引入全功能Office 2…

C#之DotNetBar2使用方法 - superTabControl1

C#版本&#xff1a;DevComponents.DotNetBar2 14.1.0 &#xff08;可以搜下各种版本&#xff09; 常用的控件使用属性&#xff0c;方法&#xff1b; 1&#xff09;superTabControl1 关闭和菜单设置方法 visibletrue/false closebox :关闭当前选中的TAB menubox:切换tab的菜…

DevComponents.DotNetBar2之SuperTabControl使用技巧

关于类似SuperTabControl的使用如何动态调整其TAB标签的顺序问题&#xff0c;搜了全网也没有找到类似答案&#xff0c;都提到tab键的顺序或者是通过控件界面进行调整其顺序&#xff0c;都不是想要的结果&#xff0c;有个网友问的类似问题但是没有一个答案可用。经过反复测试总结…

界面控件DotNetBar for WinForms使用教程:LayoutControl详解(二)

DotNetBar for WinForms是一个拥有89个组件的用户界面控件套包&#xff0c;用户可以使用Visual Studio 2005-2015轻松地创建专业的用户界面。十多年来DotNetBar帮助开发人员轻松地创建易用的专业Windows Forms (WinForms) 用户界面。 点击下载DotNetBar for WinForms最新试用版…

DotNetBar布局(一)

相信大家搞.NET桌面程序开发都会用到一些界面布局的组件&#xff0c;常用的由DotNetBar和devexpress。今天主要将DotNetBar在项目中布局简单介绍一下&#xff0c;个人感觉这个控件还是有很多bug的&#xff0c;不知道什么时候就出现莫名奇妙的排版问题错误。比如突然在设计视图D…

dotnetbar-SuperTabControl禁止调整顺序

superTabCtl.ReorderTabsEnabled false; 禁止调整TAB顺序 superTabCtl.CloseButtonOnTabsAlwaysDisplayedfalse; 禁止x关闭按钮一直在TAB上显示 superTabCtl.CloseButtonOnTabsVisibletrue/false;关闭按钮是否可见 注意&#xff1a; superTabitem.CloseButtonVisibletru…

Visual Studio 2019 中使用 DotNetBar

1、下载并安装DotNetBarSetupTrial 2、在新建项目或者现有项目中进行引用&#xff0c;找到DotNetBar安装路径中需要用到的dll引用&#xff0c;引用路径正确是关键 3、在工具箱中添加选项卡&#xff0c;加载需要用到的控件 先在工具箱空白处添加选项卡&#xff0c;方便管理&am…