Excel表格读取的工具类的编写--读取表格内容包括合并单元格

读取excel表格的内容,并且读取excel合并单元格的内容,从合并的单元格中找到有值的单元格内容返回

读取excel表格的excel格式可以是

读取的代码:


    /**
    * @Description: 判断excel表格合并单元格哪个单元格有值,返回有值的那个表格
    * @Author: fuwei
    * @Date: 2020/1/2 9:55
    */

    public static String getMergeValue(Result result,Sheet sheet) {
        //为空判断
        if (result == null) {
            log.info("需要获取值的单元格为null");
            return null;
        }
        //判断是否是合并单元格
        if (result.isMergeCell()) {
            int firstColumn = result.getFirstColumn();
            int lastColumn = result.getLastColumn();
            int firstRow = result.getFirstRow();
            int lastRow = result.getLastRow();

            //判断是上下合并,列相同,行不同
            if (firstColumn == lastColumn && firstRow!=lastRow) {
                for (int i= firstRow-1; i<lastRow ; i++){
                    Row row = sheet.getRow(i);
                    Cell cell = row.getCell(lastColumn-1);
                    String cellStringValue = getCellStringValue(cell);
                    if (!cellStringValue.isEmpty()){
                        return cellStringValue;
                    }
                }
                //判断是不是左右合并
            } else if (firstRow == lastRow && firstColumn!=lastColumn) {
                //获取当前行
                Row row = sheet.getRow(firstRow-1);
                for (int i = firstColumn-1; i < lastColumn; i++) {
                    Cell cell = row.getCell(i);
                    String cellStringValue = getCellStringValue(cell);
                    if (!cellStringValue.isEmpty()) {
                        return cellStringValue;
                    }
                }
                //其他合并方式
            } else {
                //当进行多行,多列合并的时候
                for (int i = firstRow-1; i <=lastRow  ; i++) {
                    Row row = sheet.getRow(i);
                    for (int j = firstColumn-1; j<= lastColumn ;j++){
                        Cell cell = row.getCell(j);
                        String cellStringValue = getCellStringValue(cell);
                        if (!cellStringValue.isEmpty()) {
                            return cellStringValue;
                        }
                    }

                }
            }
        } else {
            Row row = sheet.getRow(result.getFirstRow());
            Cell cell = row.getCell(result.getFirstColumn());
            String cellStringValue = getCellStringValue(cell);
            return cellStringValue;
        }
    return "";
    }

获取值的方法:

 /**
     *根据数据格式进行数据的获取,并转换
     * @param cell
     * @return
     *
     */
    public static String getCellStringValue(Cell cell) {
        String cellValue = "";
        switch (cell.getCellType()) {
            case STRING://字符串类型
                cellValue = cell.getStringCellValue();
                if(cellValue.trim().equals("")||cellValue.trim().length()<=0)
                    cellValue.isEmpty();
                break;
            case NUMERIC: //数值类型
                //判断数值类型中是不是日期格式
                if (HSSFDateUtil.isCellDateFormatted(cell))
                {
                    SimpleDateFormat sdf = null;
                    if (cell.getCellStyle().getDataFormat() == HSSFDataFormat
                            .getBuiltinFormat("h:mm")) {
                        sdf = new SimpleDateFormat("HH:mm");
                    } else {// 日期
                        sdf = new SimpleDateFormat("yyyy-MM-dd");
                    }
                    Date date = cell.getDateCellValue();
                    cellValue = sdf.format(date);
                }else {
                    cellValue = String.valueOf(cell.getNumericCellValue());
                }

                break;
            case FORMULA: //公式
                cell.setCellType(CellType.FORMULA);
                cellValue = String.valueOf(cell.getNumericCellValue());
                break;
            case BLANK:
                cellValue.isEmpty();
                break;
            case BOOLEAN:
                break;
            case ERROR:
                break;
            default:
                break;
        }
        return cellValue;
    }

判断是否是合并单元格方法在我上一个博客中

如有异议,欢迎提问

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的工具类,可以在 C++ 中使用 Win32API 和 COM 技术读取 Excel 表格: ```cpp #include <Windows.h> #include <ole2.h> #include <stdio.h> #include <tchar.h> class ExcelReader { public: ExcelReader() : m_pExcelApp(NULL), m_pWorkbooks(NULL), m_pWorkbook(NULL), m_pSheet(NULL) {} ~ExcelReader() { Close(); } bool Open(const TCHAR* szFile, const TCHAR* szSheet = NULL) { if (szFile == NULL || szFile[0] == _T('\0')) { return false; } // 初始化 COM 库 CoInitialize(NULL); // 打开 Excel 应用程序 m_pExcelApp = NULL; if (FAILED(CoCreateInstance(CLSIDExcelApplication, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&m_pExcelApp))) { return false; } // 显示 Excel 应用程序 m_pExcelApp->PutVisible(VARIANT_TRUE); // 获取 Workbooks 对象 m_pWorkbooks = m_pExcelApp->GetWorkbooks(); if (m_pWorkbooks == NULL) { return false; } // 打开工作簿 m_pWorkbook = m_pWorkbooks->Open(szFile); if (m_pWorkbook == NULL) { return false; } // 获取 Sheets 对象 m_pSheets = m_pWorkbook->GetSheets(); if (m_pSheets == NULL) { return false; } // 选择指定的工作表 if (szSheet != NULL && szSheet[0] != _T('\0')) { m_pSheet = m_pSheets->GetItem(COleVariant(szSheet)); if (m_pSheet == NULL) { return false; } } else { m_pSheet = m_pSheets->GetItem(COleVariant((short)1)); } return true; } void Close() { if (m_pSheet != NULL) { m_pSheet->Release(); m_pSheet = NULL; } if (m_pSheets != NULL) { m_pSheets->Release(); m_pSheets = NULL; } if (m_pWorkbook != NULL) { m_pWorkbook->Close(VARIANT_TRUE); m_pWorkbook->Release(); m_pWorkbook = NULL; } if (m_pWorkbooks != NULL) { m_pWorkbooks->Release(); m_pWorkbooks = NULL; } if (m_pExcelApp != NULL) { m_pExcelApp->Quit(); m_pExcelApp->Release(); m_pExcelApp = NULL; } // 反初始化 COM 库 CoUninitialize(); } int GetRowCount() const { if (m_pSheet == NULL) { return 0; } COleVariant vResult; COleVariant vProp((short)7); // XlRangeValueDataType.xlRangeValueDefault // 获取行数 LPDISPATCH pDisp = m_pSheet->GetUsedRange(); if (pDisp == NULL) { return 0; } IDispatch* pRow = NULL; IDispatch* pColumns = NULL; int nRowCount = 0; int nColumnCount = 0; try { pRow = pDisp->GetIDispatch(TRUE); pColumns = pDisp->GetIDispatch(FALSE); COleVariant vRowCount; vRowCount.vt = VT_I4; vRowCount.lVal = 1; COleVariant vColumnCount; vColumnCount.vt = VT_I4; vColumnCount.lVal = 1; DISPID dispid; LPOLESTR lpszMember = _T("Rows"); if (FAILED(pColumns->GetIDsOfNames(IID_NULL, &lpszMember, 1, LOCALE_USER_DEFAULT, &dispid))) { throw; } if (FAILED(pColumns->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, NULL, &vResult, NULL, NULL))) { throw; } IDispatch* pRows = vResult.pdispVal; DISPPARAMS dispparams = { NULL, NULL, 0, 0 }; if (FAILED(pRows->Invoke(DISPID_ITEM, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispparams, &vResult, NULL, NULL))) { throw; } nRowCount = vResult.lVal; lpszMember = _T("Columns"); if (FAILED(pRow->GetIDsOfNames(IID_NULL, &lpszMember, 1, LOCALE_USER_DEFAULT, &dispid))) { throw; } if (FAILED(pRow->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, NULL, &vResult, NULL, NULL))) { throw; } IDispatch* pColumns = vResult.pdispVal; if (FAILED(pColumns->Invoke(DISPID_ITEM, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispparams, &vResult, NULL, NULL))) { throw; } nColumnCount = vResult.lVal; } catch (...) { if (pRow != NULL) { pRow->Release(); } if (pColumns != NULL) { pColumns->Release(); } if (pDisp != NULL) { pDisp->Release(); } return 0; } if (pRow != NULL) { pRow->Release(); } if (pColumns != NULL) { pColumns->Release(); } if (pDisp != NULL) { pDisp->Release(); } return nRowCount; } int GetColumnCount() const { if (m_pSheet == NULL) { return 0; } COleVariant vResult; COleVariant vProp((short)7); // XlRangeValueDataType.xlRangeValueDefault // 获取列数 LPDISPATCH pDisp = m_pSheet->GetUsedRange(); if (pDisp == NULL) { return 0; } IDispatch* pRow = NULL; IDispatch* pColumns = NULL; int nRowCount = 0; int nColumnCount = 0; try { pRow = pDisp->GetIDispatch(TRUE); pColumns = pDisp->GetIDispatch(FALSE); COleVariant vRowCount; vRowCount.vt = VT_I4; vRowCount.lVal = 1; COleVariant vColumnCount; vColumnCount.vt = VT_I4; vColumnCount.lVal = 1; DISPID dispid; LPOLESTR lpszMember = _T("Rows"); if (FAILED(pColumns->GetIDsOfNames(IID_NULL, &lpszMember, 1, LOCALE_USER_DEFAULT, &dispid))) { throw; } if (FAILED(pColumns->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, NULL, &vResult, NULL, NULL))) { throw; } IDispatch* pRows = vResult.pdispVal; DISPPARAMS dispparams = { NULL, NULL, 0, 0 }; if (FAILED(pRows->Invoke(DISPID_ITEM, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispparams, &vResult, NULL, NULL))) { throw; } nRowCount = vResult.lVal; lpszMember = _T("Columns"); if (FAILED(pRow->GetIDsOfNames(IID_NULL, &lpszMember, 1, LOCALE_USER_DEFAULT, &dispid))) { throw; } if (FAILED(pRow->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, NULL, &vResult, NULL, NULL))) { throw; } IDispatch* pColumns = vResult.pdispVal; if (FAILED(pColumns->Invoke(DISPID_ITEM, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispparams, &vResult, NULL, NULL))) { throw; } nColumnCount = vResult.lVal; } catch (...) { if (pRow != NULL) { pRow->Release(); } if (pColumns != NULL) { pColumns->Release(); } if (pDisp != NULL) { pDisp->Release(); } return 0; } if (pRow != NULL) { pRow->Release(); } if (pColumns != NULL) { pColumns->Release(); } if (pDisp != NULL) { pDisp->Release(); } return nColumnCount; } bool ReadCell(int nRow, int nCol, CString& strValue) const { if (m_pSheet == NULL) { return false; } COleVariant vResult; COleVariant vProp((short)7); // XlRangeValueDataType.xlRangeValueDefault // 读取单元格的值 COleVariant vRow((short)nRow); COleVariant vCol((short)nCol); LPDISPATCH pDisp = m_pSheet->GetCells(); if (pDisp == NULL) { return false; } IDispatch* pCell = NULL; try { if (FAILED(pDisp->Invoke(DISPID_ITEM, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &vRow, &vResult, NULL, NULL))) { throw; } pCell = vResult.pdispVal; DISPID dispid; LPOLESTR lpszMember = _T("Item"); if (FAILED(pCell->GetIDsOfNames(IID_NULL, &lpszMember, 1, LOCALE_USER_DEFAULT, &dispid))) { throw; } DISPPARAMS dispparams = { NULL, NULL, 0, 0 }; if (FAILED(pCell->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispparams, &vResult, NULL, NULL))) { throw; } if (vResult.vt == VT_BSTR) { strValue = CString(vResult.bstrVal); } else { strValue.Empty(); } } catch (...) { if (pCell != NULL) { pCell->Release(); } if (pDisp != NULL) { pDisp->Release(); } return false; } if (pCell != NULL) { pCell->Release(); } if (pDisp != NULL) { pDisp->Release(); } return true; } private: IDispatch* m_pExcelApp; // Excel 应用程序对象 IDispatch* m_pWorkbooks; // Workbooks 对象 IDispatch* m_pWorkbook; // Workbook 对象 IDispatch* m_pSheets; // Sheets 对象 IDispatch* m_pSheet; // Worksheet 对象 }; ``` 使用示例: ```cpp ExcelReader reader; if (!reader.Open(_T("C:\\test.xls"), _T("Sheet1"))) { printf("Open file failed!\n"); return; } int nRowCount = reader.GetRowCount(); int nColumnCount = reader.GetColumnCount(); for (int i = 1; i <= nRowCount; i++) { for (int j = 1; j <= nColumnCount; j++) { CString strValue; if (reader.ReadCell(i, j, strValue)) { printf("%s\t", strValue); } } printf("\n"); } reader.Close(); ``` 需要注意的是,该工具类依赖于 Microsoft Office Excel 应用程序,因此需要在使用前确保已经安装了 Excel 并且系统中有相应的 COM 组件。同时,该工具类只能在 Windows 平台下使用,无法在 Linux、macOS 等其他操作系统上编译和运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值