Java使用Apache.POI导入包含合并单元格的Excel文档

1、导入的excel表格

 

2、Demo展示:导入包含合并单元格的Excel文档的代码如下所示。

package cn.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 
/**
 * 导入包含合并单元格的Excel文档
 *
 */
public class test{

    public static void main(String[] args) throws FileNotFoundException {
    	test ti = new test();
    	InputStream input = null;
    	Workbook workbook = null;
    	try {
    		// 获取文件流
    		input = new FileInputStream(new File("d://111.xlsx"));
    		// 读取Excel文件工作表
    		workbook = ti.readFile(input, "111.xlsx");
    		//取得第一个工作表
    		Sheet sheet = workbook.getSheetAt(0);
    		// 获取工作表数据
    		List<Map<Integer,Object>> list = ti.getBody(sheet,8,2);
    		for(Map<Integer,Object> item : list) {
    			System.out.println(item);
    		}
    	} catch (Exception e1) {
    		e1.printStackTrace();
    	} finally {
    		try {
    			if (null != workbook) {
    				workbook.close();
    			}
    			if(null != input) {
    				input.close();
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    }

    /**
     * 读取Excel文件工作表
     * @param inputStream 文件流
     * @param fileName 文件名称
     * @return
     */
    public Workbook readFile(InputStream input,String fileName){
    	Workbook wb  = null;

    	//判断是否是excel2007格式
    	boolean isE2007 = false;
    	if(fileName.endsWith("xlsx")){
    		isE2007 = true;
    	}

    	try {
    		//根据文件格式(2003或者2007)来初始化
    		if(isE2007){
    			wb = new XSSFWorkbook(input);
    		} else {
    			wb = new HSSFWorkbook(input);
    		}
    	} catch (IOException e) {
    		e.printStackTrace();
    	}
    	return wb;
    }

    /**
     * 获取内部内容
	 * @param sheet 工作表
	 * @param column 有效数据列数
	 * @param headerCount 表头行数
	 * @return
	 */
    public List<Map<Integer,Object>> getBody(Sheet sheet, int column, int headerCount){
    	//总行数  
    	int count = sheet.getLastRowNum() + 1;

    	//sheet中所有合并的单元格信息
    	List<CellRangeAddress> cras = getCombineCell(sheet);

    	//存储行信息
    	List<Map<Integer,Object>> irs = new ArrayList<>();

		//表头只有2行
		for(int i = headerCount; i < count;i++){
			//存储列信息
			Map<Integer,Object> map = new HashMap<Integer,Object>();

			for(int x = 0;x < column;x++) {
				// 判断当前处理单元格是不是合并单元格
				CellRangeAddress range = isMergedRegion(cras,i,x);

				// 如果当前单元格属于合并单元格
				if(null != range){
					//拿到合并单元格的开始行数和开始列数
					int firstColumn = range.getFirstColumn();
					int firstRow = range.getFirstRow();

					//根据开始行数和开始列数获取单元格的值
					Row row = sheet.getRow(firstRow);
					map.put(x,getCellValue(row.getCell(firstColumn)));
				} else {
					//如果不是合并单元格,直接拿当前单元格的值
					Row row = sheet.getRow(i);
					map.put(x,getCellValue(row.getCell(x)));
				}
			}
			irs.add(map);
		}
		return irs;
	}

	/**  
	 * 获取sheet中合并的单元格信息,并返回合并的单元格list
	 * @param sheet  需要导入的工作表
	 * @return List<CellRangeAddress> 合并的单元格list
	 */
	public List<CellRangeAddress> getCombineCell(Sheet sheet){
		List<CellRangeAddress> list = new ArrayList<CellRangeAddress>();
		//获得一个 sheet 中合并单元格的数量
		int sheetmergerCount = sheet.getNumMergedRegions();
		//遍历所有的合并单元格
		for(int i = 0; i<sheetmergerCount;i++)
		{
			//获得合并单元格保存进list中
			CellRangeAddress ca = sheet.getMergedRegion(i);
			list.add(ca);
		}
		return list;
	}

	/**   
	 * 判断指定的单元格是否是合并单元格   
	 * @param cras 合并的单元格list
	 * @param row 行下标
	 * @param column 列下标
	 * @return   
	 */                                                                                
	private CellRangeAddress isMergedRegion(List<CellRangeAddress> cras,int row ,int column) {
		for (CellRangeAddress range : cras) {
			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 range;
				}
			}
		}
		return null;
	}
	
	/**
	 * 获取单元格的值
	 * @param cell
	 * @return
	 */
	public String getCellValue(Cell cell) {
		String cellValue = "";
		if (cell == null) {
			return cellValue;
		}
		// 判断数据的类型
		switch (cell.getCellType()) {
			case Cell.CELL_TYPE_NUMERIC: // 数字
				if (HSSFDateUtil.isCellDateFormatted(cell)) {// 处理日期格式
					Date date = cell.getDateCellValue(); 
					DateFormat formater = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
					cellValue = formater.format(date);
				} else if (cell.getCellStyle().getDataFormat() == 0) {//处理数值格式
					cell.setCellType(Cell.CELL_TYPE_STRING);
					cellValue = String.valueOf(cell.getRichStringCellValue().getString());
				}
				break;
			case Cell.CELL_TYPE_STRING: // 字符串
				cellValue = String.valueOf(cell.getStringCellValue());
				break;
			case Cell.CELL_TYPE_BOOLEAN: // Boolean
				cellValue = String.valueOf(cell.getBooleanCellValue());
				break;
			case Cell.CELL_TYPE_FORMULA: // 公式
				cellValue = String.valueOf(cell.getCellFormula());
				break;
			case Cell.CELL_TYPE_BLANK: // 空值
				cellValue = "";
				break;
			case Cell.CELL_TYPE_ERROR: // 故障
				cellValue = "";
				break;
			default: // 未知类型
				cellValue = cell.toString().trim();
				break;
		}
		return cellValue;
	}

}

3、excel表格中的数据打印结果如下图

 

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Java使用Apache POI库实现Excel导入合并单元格的示例代码: ```java import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.XSSFCellStyle; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExcelImportAndMergeCells { public static void main(String[] args) throws IOException { // 读取Excel文件 FileInputStream inputStream = new FileInputStream(new File("example.xlsx")); Workbook workbook = WorkbookFactory.create(inputStream); Sheet sheet = workbook.getSheetAt(0); // 合并单元格 CellRangeAddress mergedRegion = new CellRangeAddress(0, 1, 0, 3); sheet.addMergedRegion(mergedRegion); // 设置合并后单元格的样式 XSSFCellStyle style = (XSSFCellStyle) workbook.createCellStyle(); style.setAlignment(CellStyle.ALIGN_CENTER); style.setVerticalAlignment(CellStyle.VERTICAL_CENTER); Row row = sheet.getRow(0); Cell cell = row.getCell(0); cell.setCellStyle(style); // 输出合并后单元格的值 System.out.println(row.getCell(0).getStringCellValue()); // 关闭文件流 inputStream.close(); } } ``` 上述代码,我们首先使用`FileInputStream`读取Excel文件,然后使用`WorkbookFactory`创建`Workbook`对象,接着获取第一个`Sheet`对象。接下来,我们使用`CellRangeAddress`创建一个需要合并的单元格区域,使用`Sheet`的`addMergedRegion`方法将单元格区域合并。然后,我们使用`Workbook`的`createCellStyle`方法创建一个单元格样式,设置样式的对齐方式和垂直对齐方式,将样式应用到合并后的单元格上。最后,我们输出合并后单元格的值,并关闭文件流。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值