excel合并含合并同类项的导出

本文详细介绍了使用Java和Apache POI库读取并解析Excel文件的方法,包括打开文件、获取工作表数量、行数、指定工作表的行内容等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.eastcom_sw.inas.common.utils.excel;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
/**
 * 用于读取excel
 */
public class ExcelReader1 {
	 private HSSFWorkbook wb = null;//Excel文档对象
	 private HSSFSheet sheet = null;//Excel表单对象
	 private HSSFRow row = null;//Excel行
	 private int sheetNum = 0;//第1个工作表
	 private int rowNum = 0;
	 private InputStream fis = null;
	 private CommonsMultipartFile file = null;
	 public ExcelReader1() {
	 }
	 public ExcelReader1(CommonsMultipartFile file) {
		 this.file = file;
	 }
	 public void setRowNum(int rowNum) {
		 this.rowNum = rowNum;
	 }
	 public void setSheetNum(int sheetNum) {
		 this.sheetNum = sheetNum;
	 }
	 public void setFile(CommonsMultipartFile file) {
		 this.file = file;
	 }
	 /**
	  * 读取excel文件获得HSSFWorkbook对象
	  */
	 public void open() throws IOException {
//		  fis = new FileInputStream(file);
		  fis = file.getInputStream();
		  wb = new HSSFWorkbook(new POIFSFileSystem(fis));
		  fis.close();
	 }
	 /**
	  * 返回sheet表数目
	  * 
	  * @return int
	  */
	 public int getSheetCount() {
		  int sheetCount = -1;
		  sheetCount = wb.getNumberOfSheets();
		  return sheetCount;
	 }
	 /**
	  * sheetNum下的记录行数
	  * 
	  * @return int
	  */
	 public int getRowCount() {
		  if (wb == null)
			  System.out.println("=============>WorkBook为空");
		  HSSFSheet sheet = wb.getSheetAt(this.sheetNum);
		  int rowCount = -1;
		  rowCount = sheet.getLastRowNum();
		  return rowCount;
	 }
	 /**
	  * 读取指定sheetNum的rowCount
	  * 
	  * @param sheetNum
	  * @return int
	  */
	 public int getRowCount(int sheetNum) {
		  HSSFSheet sheet = wb.getSheetAt(sheetNum);
		  int rowCount = -1;
		  rowCount = sheet.getLastRowNum();
		  return rowCount;
	 }
	 /**
	  * 得到指定行的内容
	  * 
	  * @param lineNum
	  * @return String[]
	  */
	 public String[] readExcelLine(int lineNum) {
		 return readExcelLine(this.sheetNum, lineNum);
	 }
	 /**
	  * 指定工作表和行数的内容
	  * 
	  * @param sheetNum
	  * @param lineNum
	  * @return String[]
	  */
	 public String[] readExcelLine(int sheetNum, int lineNum) {
		  if (sheetNum < 0 || lineNum < 0)
			  return null;
		  String[] strExcelLine = null;
		  try {
			   sheet = wb.getSheetAt(sheetNum);
			   row = sheet.getRow(lineNum);
			   int cellCount=0;
			   if(!isBlankRow(row)){
				   cellCount = row.getLastCellNum();//获得最后一个单元格的索引
			   }
			   strExcelLine = new String[cellCount + 1];
			   for (int i = 0; i < cellCount; i++) {
				   strExcelLine[i] = readStringExcelCell(lineNum, i);   
			   }
		  } catch (Exception e) {
			  e.printStackTrace();
		  }
		  return strExcelLine;
	 }
	 /**
	  * 读取指定列的内容
	  * 
	  * @param cellNum
	  * @return String
	  */
	 public String readStringExcelCell(int cellNum) {
		 return readStringExcelCell(this.rowNum, cellNum);
	 }
	 /**
	  * 指定行和列编号的内容
	  * 
	  * @param rowNum
	  * @param cellNum
	  * @return String
	  */
	 public String readStringExcelCell(int rowNum, int cellNum) {
		 return readStringExcelCell(this.sheetNum, rowNum, cellNum);
	 }
	 /**
	  * 指定工作表、行、列下的内容
	  * 
	  * @param sheetNum
	  * @param rowNum
	  * @param cellNum
	  * @return String
	  */
	 public String readStringExcelCell(int sheetNum, int rowNum, int cellNum) {
		  if (sheetNum < 0 || rowNum < 0)
			  return "";
		  String strExcelCell = "";
		  try {
			   sheet = wb.getSheetAt(sheetNum);
			   row = sheet.getRow(rowNum);
			   if(row.getCell((short)cellNum) != null){
				    switch (row.getCell((short) cellNum).getCellType()) {
					    case HSSFCell.CELL_TYPE_FORMULA://如果是公式型
						     strExcelCell = "FORMULA ";
						     break;
					    case HSSFCell.CELL_TYPE_NUMERIC: //如果是数字型
						     strExcelCell = String.valueOf(row.getCell((short) cellNum).getNumericCellValue());    
						     break;
					    case HSSFCell.CELL_TYPE_STRING://如果是字符串型
						     strExcelCell = row.getCell((short) cellNum).getStringCellValue();
						     break;
		                case HSSFCell.CELL_TYPE_BOOLEAN://如果是布尔型
			                 strExcelCell=String.valueOf(row.getCell((short) cellNum).getBooleanCellValue());
			                 break;
					    case HSSFCell.CELL_TYPE_BLANK://如果是空串
						     strExcelCell = "";
						     break;
		                case HSSFCell.CELL_TYPE_ERROR://如果是错误型              
			                 strExcelCell = String.valueOf(row.getCell((short) cellNum).getErrorCellValue());
			                 break;
					    default:
						     strExcelCell = "";
						     break;
				    }
			   }
			   else{
				   strExcelCell = "";
			   }
		  } catch (Exception e) {
			  e.printStackTrace();
		  }
		  return strExcelCell;
	 }
	 //判断指定行单元格是否为空
	 public static boolean isBlankRow(HSSFRow row){
        if(row == null) return true;
        boolean result = true;       
        for(int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++){
            HSSFCell cell = row.getCell(i, HSSFRow.RETURN_BLANK_AS_NULL); 
            String value = "";
            if(cell != null){
                switch (cell.getCellType()) {
                case HSSFCell.CELL_TYPE_STRING://如果是字符串型
                    value = cell.getStringCellValue();
                    break;
                case HSSFCell.CELL_TYPE_NUMERIC://如果是数字型
                    value = String.valueOf((int) cell.getNumericCellValue());
                    break;
                case HSSFCell.CELL_TYPE_BOOLEAN://如果是布尔型
                    value = String.valueOf(cell.getBooleanCellValue());
                    break;
                case HSSFCell.CELL_TYPE_FORMULA://如果是公式型
                    value = String.valueOf(cell.getCellFormula());
                    break;
                case HSSFCell.CELL_TYPE_BLANK://如果是空串
                 value="";
                    break;                
                case HSSFCell.CELL_TYPE_ERROR://如果是错误型              
                 value = String.valueOf(cell.getErrorCellValue());
                default://其他类型
                 value="";
                    break;
                }              
            }
            if(!value.trim().equals("")){
                result = false;
                break;
            }
        }         
        return result;
	 }
	 // 主函数用于测试
	 public static void main(String args[]) {
//		  File file = new File("E:\\text.xls");
//		  CommonsMultipartFile file1 = new CommonsMultipartFile("E:\\text.xls");
//		  ExcelReader1 readExcel = new ExcelReader1(file1);
//		  try {
//			  readExcel.open();
//		  } catch (IOException e) {
//			  e.printStackTrace();
//		  }
//		  readExcel.setSheetNum(0); //设置读取索引为0的工作表
//		  //总行数
//		  int count = readExcel.getRowCount();
//		  for (int i = 0; i <= count; i++) {
//			   String[] rows = readExcel.readExcelLine(i);
//			   if(rows.length>0){
//				    for (int j = 0; j < rows.length; j++) {
//					     if(!(rows[j]==null)){
//					      System.out.print(rows[j] + " ");
//					     }
//				    }
//			   }
//			   System.out.print("\n");
//		  }
	}
}

在Python中,合并Excel中的同类项通常涉及到使用数据处理库,比如pandas。pandas提供了强大的数据处理功能,可以方便地读取、处理和写入Excel文件。以下是使用pandas合并Excel中的同类项的基本步骤: 1. 安装并导入pandas库。如果还未安装pandas,可以使用pip命令安装:`pip install pandas`。然后在代码中导入pandas库。 ```python import pandas as pd ``` 2. 使用pandas读取Excel文件。可以使用`read_excel`函数来加载Excel文件到DataFrame对象中。 ```python df = pd.read_excel('example.xlsx') ``` 3. 对DataFrame进行处理,合并同类项。这通常涉及以下几种方法: - 如果是按照某一列的值进行合并,可以使用`groupby`和`agg`函数。 - 如果需要合并具有相同索引的行,可以使用`groupby(level=0)`。 - 如果合并的是字符串类型的值,可以使用`groupby`配合字符串操作函数。 以下是一个简单的例子,展示了如何按照某列的值进行合并: ```python # 假设我们要根据'Category'列合并数据,并对'Value'列进行求和 grouped = df.groupby('Category').agg({'Value': 'sum'}) ``` 4. 将处理后的数据写回到新的Excel文件中。可以使用`to_excel`函数实现。 ```python grouped.to_excel('merged_example.xlsx') ``` 综合以上步骤,合并Excel中的同类项的基本代码框架如下: ```python import pandas as pd # 读取Excel文件 df = pd.read_excel('example.xlsx') # 根据需要合并的列进行分组并聚合 grouped = df.groupby('需要合并的列名').agg({'需要合并的值列名': '聚合函数'}) # 将合并后的结果输出到新的Excel文件 grouped.to_excel('合并结果.xlsx') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值