• EXCEL2016 OLE/COM开发-常用功能封装代码


    hpp

      1 #pragma once
      2 #include "stdafx.h"
      3 #include "CApplication.h"
      4 #include "CWorkbook.h"
      5 #include "CWorksheet.h"
      6 #include "CRange.h"
      7 #include "CWorkbooks.h"
      8 #include "CWorksheets.h"
      9 #include "Cnterior.h"
     10 #include "CFont0.h"
     11 #include "CShape.h"
     12 #include "CShapes.h"
     13 #include <string>
     14 #include <vector>
     15 
     16 using namespace std;
     17 
     18 class ExcelApi
     19 {
     20 public:
     21     ExcelApi(void);
     22     ~ExcelApi(void);
     23 
     24     // 初始化Excel OLE
     25     BOOL InitExcel();
     26 
     27     /**
     28     * @brief 新建Excel
     29     * @param[in] ExcalPath  路径
     30     */
     31     void CreateExcel(const char* ExcalPath);
     32 
     33     /**
     34     * @brief 打开Excel
     35     * @param[in] filePath  路径
     36     * @param[in] type  打开时是否显示EXCEL
     37     * @return BOOL 打开成功&失败
     38     */
     39     BOOL OpenFile(const char* filePath, bool type);
     40 
     41 
     42     /**
     43     * @brief 关闭Excel
     44     */
     45     void CloseExcel();
     46 
     47 
     48     /**
     49     * @brief 保存Excel
     50     */
     51     void Save();
     52 
     53 
     54     /**
     55     * @brief 获取所有的工作表数量
     56     * @return int 数量
     57     */
     58     int GetSheetCount();
     59 
     60 
     61     /**
     62     * @brief 设置当前工作表
     63     * @param[in] id  第几个sheet,从1开始
     64     * @return BOOL 设置成功&失败
     65     */
     66     BOOL SetCurrentSheetByNum(const int& id);
     67 
     68 
     69     /**
     70     * @brief 设置当前工作表
     71     * @param[in] sheet_name  sheet的名字
     72     * @return BOOL 设置成功&失败
     73     */
     74     BOOL SetCurrentSheetByName(string sheet_name);
     75 
     76 
     77     /**
     78     * @brief 获取单元格数据
     79     * @param[in] row  行
     80     * @param[in] column  列
     81     * @return string 内容
     82     */
     83     string GetRangeData(const int row, const int column);
     84 
     85 
     86     /**
     87     * @brief 获取sheet名字
     88     * @return string 名字
     89     */
     90     string GetSheetName();
     91 
     92 
     93     /**
     94     * @brief 设置sheet名字
     95     */
     96     void SetSheetName(const int SheetNum, const char* SheetName);
     97 
     98 
     99     /**
    100     * @brief 当前sheet单元格写入内容
    101     * @param[in] row  行
    102     * @param[in] column  列
    103     * @param[in] Data  内容
    104     */
    105     void SetRangeData(const int row, const int column, const char* Data);
    106 
    107 
    108     /**
    109     * @brief 获得当前sheet使用的行数
    110     * @return int 数量
    111     */
    112     int GetRowNum();
    113 
    114 
    115     /**
    116     * @brief 获得当前sheet使用的列数
    117     * @return int 数量
    118     */
    119     int GetColumnNum();
    120 
    121 
    122     /**
    123     * @brief 删除单元格
    124     * @param[in] A1  起始单元格
    125     * @param[in] B1  结束单元格
    126     * @param[in] type  类型(设置删除类型1.右侧单元格左移 2.下方单元格上移 3.整行 4.整列)
    127     */
    128     void DeleteRange(char* A1, char* B1, int type);
    129 
    130     /**
    131     * @brief 添加单元格
    132     * @param[in] A1  起始单元格
    133     * @param[in] B1  结束单元格
    134     * @param[in] type  类型(设置添加类型1.右侧单元格左移 2.下方单元格上移 3.整行 4.整列)
    135     */
    136     void AddRange(char* A1, char* B1, int type);
    137 
    138 
    139     /**
    140     * @brief 设置字体和颜色
    141     * @param[in] A1  起始单元格
    142     * @param[in] B1  结束单元格
    143     * @param[in] FontType  字体类型
    144     * @param[in] FontColor  字体颜色
    145     * @param[in] FontSize  字体大小
    146     */
    147     void SetFont(char* A1, char* B1, char* FontType, int FontColor, int FontSize);
    148 
    149 
    150     /**
    151     * @brief 设置单元格填充颜色
    152     * @param[in] A1  起始单元格
    153     * @param[in] B1  结束单元格
    154     * @param[in] FontColor  颜色
    155     */
    156     void SetRangeColor(char* A1, char* B1, int RangeColor);
    157 
    158 
    159     /**
    160     * @brief 遍历某一单元格,替换内容
    161     * @param[in] CycleName  要遍历的名字
    162     * @param[in] NewName  写入的新名字
    163     */
    164     void CycleRangeSetData(char* CycleName, char* NewName);
    165 
    166 
    167     /**
    168     * @brief 遍历某一单元格,返回所在的行和列(vector)
    169     * @param[in] CycleName  要遍历的名字
    170     */
    171     vector<string>CycleRangeReturnRowColumn(char* CycleName);
    172 
    173 
    174     /**
    175     * @brief 刷一行值
    176     * @param[in] CycleName  要遍历的名字
    177     * @param[in] NewName1  写入的新名字
    178     * @param[in] NewName2  写入的新名字
    179     * @param[in] NewName3  写入的新名字
    180     * @param[in] NewName4  写入的新名字
    181     * @param[in] NewName5  写入的新名字
    182     * @param[in] NewName6  写入的新名字
    183     * @param[in] NewName7  写入的新名字
    184     * @param[in] NewName8  写入的新名字
    185     */
    186     void ShuaValue(const char* CycleName, const char* NewName1, const char* NewName2, const char* NewName3, const char* NewName4, const char* NewName5, const char* NewName6, const char* NewName7, const char* NewName8);
    187 
    188 
    189     /**
    190     * @brief 删除当前sheet所有内容
    191     */
    192     void DeleteSheetRange();
    193 
    194 
    195     /**
    196     * @brief 添加单元格框线
    197     * @param[in] LineType  线的样式:0- no line; 1-solid; 2-big dot;3-small dot;4-dash dot; 5-dash dot dot;
    198     */
    199     void SetRangeBorder(int LineType);
    200 
    201 
    202     /**
    203     * @brief 合并单元格
    204     * @param[in] A1  起始单元格
    205     * @param[in] B1  终止单元格
    206     */
    207     void SetRangeMerge(char* A1, char* B1);
    208 
    209 
    210     /**
    211     * @brief 拆分单元格
    212     * @param[in] A1  起始单元格
    213     * @param[in] B1  终止单元格
    214     */
    215     void SetRangeUnMerge(char* A1, char* B1);
    216 
    217 
    218     /**
    219     * @brief 清空单元格内容
    220     * @param[in] A1  起始单元格
    221     * @param[in] B1  终止单元格
    222     */
    223     void ClearContents(char* A1, char* B1);
    224 
    225 
    226     /**
    227     * @brief 设置所有字体左对齐
    228     * @param[in] type  类型(水平对齐:默认 1 居中 -4108, 左= -4131,右=-4152)
    229     */
    230     void SetFontHorizontalAlignment(int type);
    231 
    232 
    233     /**
    234     * @brief 设置单元格格式(文本)
    235     */
    236     void SetRangeSetting();
    237 
    238 
    239     /**
    240     * @brief 遍历单元格中复合条件的字体类型颜色大小/单元格颜色
    241     * @param[in] FontType  字体类型
    242     * @param[in] FontColor  字体颜色
    243     * @param[in] FontSize  字体大小
    244     * @param[in] RangeColor  单元格颜色
    245     */
    246     void CycleFontTypeColorSizeAndRangeColor(char* FontType, int FontColor, int FontSize, int RangeColor);
    247 
    248 
    249     /**
    250     * @brief 插入图片
    251     * @param[in] ExcalPath  存储图片文件的路径字符串
    252     * @param[in] ExcalPath  表示要连接到的文件
    253     * @param[in] ExcalPath  表示将图片与文档一起保存
    254     * @param[in] ExcalPath  图片插入位置的左上角横坐标
    255     * @param[in] ExcalPath  图片插入位置的左上角纵坐标
    256     * @param[in] ExcalPath  表示插入的图片的显示宽度
    257     * @param[in] ExcalPath  表示插入的图片的显示高度
    258     */
    259     void AddPicture(const char* Filename, long LinkToFile, long SaveWithDocument, float Left, float Top, float Width, float Height);
    260 
    261 private:
    262 
    263     bool IsOpenBook;
    264     bool IsOpenSheet;
    265 
    266     //Excel应用程序
    267     CApplication ExcelApp;
    268     //Excel工作簿
    269     CWorkbooks ExcelBooks;
    270     CWorkbook ExcelBook;
    271     //Excel工作表
    272     CWorksheets ExcelSheets;
    273     CWorksheet ExcelSheet;
    274     //Excel单元格
    275     CRange ExcelRange;
    276     //Excel字体
    277     CFont0 ft;
    278     //颜色
    279     Cnterior it;
    280     //图片
    281     CShapes shp;
    282 
    283 };
    View Code

    cpp

      1 #include "stdafx.h"
      2 #include "ExcelApi.h"
      3 
      4 COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
      5 
      6 
      7 ExcelApi::ExcelApi(void)
      8 {
      9     IsOpenBook = false;
     10     IsOpenSheet = false;
     11 }
     12 
     13 ExcelApi::~ExcelApi()
     14 {
     15 }
     16 
     17 
     18 // 初始化Excel OLE
     19 BOOL ExcelApi::InitExcel()
     20 {
     21     // 初始化COM库
     22     CoInitialize(NULL);
     23     // 初始化Excel
     24     if (!ExcelApp.CreateDispatch("Excel.Application", NULL))return FALSE;
     25     ExcelApp.put_DisplayAlerts(FALSE);       // 屏蔽警告
     26     return TRUE;
     27 }
     28 
     29 
     30 //创建EXCEL
     31 void ExcelApi::CreateExcel(const char* ExcalPath)
     32 {
     33     LPDISPATCH lpDisp;
     34     COleVariant vResult;
     35     COleVariant
     36         covTrue((short)FALSE),
     37         covFalse((short)FALSE),
     38         covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
     39 
     40     if (!ExcelApp.CreateDispatch("Excel.Application"))
     41     {
     42         AfxMessageBox("创建Excel服务失败!");
     43     }
     44 
     45     ExcelApp.put_Visible(FALSE);          //使Excel可见
     46     ExcelApp.put_UserControl(TRUE);// 设置表格状态为用户不可控制
     47     ExcelApp.put_DisplayAlerts(false);
     48 
     49     //打开fullFileName
     50     lpDisp = ExcelApp.get_Workbooks();
     51     ExcelBooks.AttachDispatch(lpDisp);
     52 
     53     COleVariant valTemp((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
     54     lpDisp = ExcelBooks.Add(valTemp);
     55     ExcelBook.AttachDispatch(lpDisp);
     56 
     57     ExcelSheets.AttachDispatch(ExcelBook.get_Worksheets());
     58     ExcelSheet.AttachDispatch(ExcelSheets.get_Item(COleVariant((short)1)));   //获取sheet1
     59     ExcelSheet.put_Name("TestName");     //设置sheet1名字
     60 
     61     //另存为
     62     ExcelBook.SaveAs(COleVariant(ExcalPath), covOptional, covOptional, covOptional,
     63         covOptional, covOptional, 0, covOptional, covOptional, covOptional, covOptional, covOptional);
     64     IsOpenBook = true;
     65 }
     66 
     67 
     68 //打开Excel
     69 BOOL ExcelApi::OpenFile(const char* filePath, bool type)
     70 {
     71     if (!ExcelApp.CreateDispatch("Excel.Application"))
     72     {
     73         AfxMessageBox("创建Excel服务失败!");
     74     }
     75     ExcelApp.put_Visible(type);//使Excel可见
     76     ExcelApp.put_UserControl(FALSE);// 设置表格状态为用户不可控制
     77     LPDISPATCH lpDisp = NULL;
     78     lpDisp = ExcelApp.get_Workbooks();
     79 
     80     ExcelBooks.AttachDispatch(lpDisp);
     81     lpDisp = ExcelBooks.Open(filePath, covOptional, covOptional, covOptional, covOptional,
     82         covOptional, covOptional, covOptional, covOptional, covOptional, covOptional,
     83         covOptional, covOptional, covOptional, covOptional);
     84     if (lpDisp == NULL)
     85     {
     86         return FALSE;
     87     }
     88     ExcelBook.AttachDispatch(lpDisp);
     89     IsOpenBook = true;
     90     return TRUE;
     91 }
     92 
     93 void ExcelApi::CloseExcel()
     94 {
     95     ExcelRange.ReleaseDispatch();
     96     ExcelSheet.ReleaseDispatch();
     97     ExcelSheets.ReleaseDispatch();
     98     ExcelBook.ReleaseDispatch();
     99     ExcelBooks.ReleaseDispatch();
    100     ExcelApp.Quit();
    101     ExcelApp.ReleaseDispatch();
    102 }
    103 
    104 
    105 void ExcelApi::Save()
    106 {
    107     ExcelBook.Save();
    108 }
    109 
    110 
    111 int ExcelApi::GetSheetCount()
    112 {
    113     if (IsOpenBook != true)
    114     {
    115         AfxMessageBox("请先打开工作簿!");
    116         return -1;
    117     }
    118 
    119     LPDISPATCH lpDisp = NULL;
    120     lpDisp = ExcelBook.get_Sheets();
    121     if (lpDisp == NULL)
    122     {
    123         return -1;
    124     }
    125     ExcelSheets.AttachDispatch(lpDisp);
    126 
    127     return ExcelSheets.get_Count();
    128 }
    129 
    130 
    131 //设置当前工作表
    132 BOOL ExcelApi::SetCurrentSheetByNum(const int& id)
    133 {
    134     if (IsOpenBook != true)
    135     {
    136         AfxMessageBox("请先打开工作簿!");
    137         return FALSE;
    138     }
    139 
    140     LPDISPATCH lpDisp = NULL;
    141     lpDisp = ExcelBook.get_Sheets();
    142     if (lpDisp == NULL)
    143     {
    144         return FALSE;
    145     }
    146     ExcelSheets.AttachDispatch(lpDisp);
    147     lpDisp = ExcelSheets.get_Item(COleVariant((short)id));
    148     if (lpDisp == NULL)
    149     {
    150         return FALSE;
    151     }
    152     ExcelSheet.AttachDispatch(lpDisp);
    153     ExcelSheet.Activate();
    154     IsOpenSheet = true;
    155     return TRUE;
    156 }
    157 BOOL ExcelApi::SetCurrentSheetByName(string sheet_name)
    158 {
    159     if (IsOpenBook != true)
    160     {
    161         AfxMessageBox("请先打开工作簿!");
    162         return FALSE;
    163     }
    164 
    165     LPDISPATCH lpDisp = NULL;
    166     lpDisp = ExcelBook.get_Sheets();
    167     if (lpDisp == NULL)
    168     {
    169         return FALSE;
    170     }
    171     ExcelSheets.AttachDispatch(lpDisp);
    172 
    173     int count = GetSheetCount();
    174     string name;
    175     int id;
    176     for (int i = 0; i < count; i++)
    177     {
    178         id = i + 1;
    179         SetCurrentSheetByNum(id);
    180         name = GetSheetName();
    181         if (sheet_name == name)
    182         {
    183             lpDisp = ExcelSheets.get_Item(COleVariant((short)id));
    184             break;
    185         }
    186     }
    187 
    188 
    189     if (lpDisp == NULL)
    190     {
    191         return FALSE;
    192     }
    193     ExcelSheet.AttachDispatch(lpDisp);
    194     ExcelSheet.Activate();
    195     IsOpenSheet = true;
    196     return TRUE;
    197 }
    198 
    199 
    200 string ExcelApi::GetRangeData(const int row, const int column)
    201 {
    202     //获得使用的区域Range(区域)
    203     ExcelRange.AttachDispatch(ExcelSheet.get_UsedRange(), TRUE);
    204 
    205     // 读取
    206     CRange range;
    207     range.AttachDispatch(ExcelRange.get_Item(COleVariant((long)row), COleVariant((long)column)).pdispVal);
    208     COleVariant vResult = range.get_Value2();
    209     range.ReleaseDispatch();
    210     // 分析vResult
    211     CString str;
    212     if (vResult.vt == VT_BSTR)str = vResult.bstrVal;                    // 字符串 
    213     else if (vResult.vt == VT_INT)str.Format(_T("%d"), vResult.pintVal);    // 整数
    214     else if (vResult.vt == VT_R8)str.Format(_T("%.3f"), vResult.dblVal);    // 8字节的整数
    215     else if (vResult.vt == VT_DATE)                                        // 时间格式
    216     {
    217         SYSTEMTIME st; VariantTimeToSystemTime(vResult.date, &st);
    218         CTime tm(st);    str = tm.Format("%Y-%m-%d");
    219     }
    220     else if (vResult.vt == VT_EMPTY)str = "";                            // 空的单元格
    221     else str = "";
    222     return str;
    223 }
    224 
    225 
    226 
    227 string ExcelApi::GetSheetName()
    228 {
    229     if (IsOpenBook != true)
    230     {
    231         AfxMessageBox("请先打开工作簿!");
    232         return "false";
    233     }
    234 
    235     return ExcelSheet.get_Name();
    236 }
    237 
    238 
    239 
    240 void ExcelApi::SetSheetName(const int SheetNum, const char* SheetName)
    241 {
    242     ExcelSheets.AttachDispatch(ExcelBook.get_Worksheets());
    243     ExcelSheet.AttachDispatch(ExcelSheets.get_Item(COleVariant((short)SheetNum)));   //获取sheet1
    244     ExcelSheet.put_Name(SheetName);     //设置sheet1名字
    245 }
    246 
    247 
    248 
    249 //当前sheet单元格写入内容
    250 void ExcelApi::SetRangeData(const int row, const int column, const char* Data)
    251 {
    252     if (IsOpenBook != true)
    253     {
    254         AfxMessageBox("请先打开工作簿!");
    255         return;
    256     }
    257 
    258     //得到全部Cells,此时,userRange是cells的集合
    259     ExcelRange.AttachDispatch(ExcelSheet.get_Cells(), TRUE);
    260 
    261     //设置表格内容
    262     ExcelRange.put_Item(COleVariant((long)row), COleVariant((long)column), COleVariant(_T(Data)));
    263 
    264 }
    265 
    266 
    267 //获得当前sheet使用的行数
    268 int ExcelApi::GetRowNum()
    269 {
    270     if (IsOpenBook != true)
    271     {
    272         AfxMessageBox("请先打开工作簿!");
    273         return 0;
    274     }
    275 
    276     //获得使用的区域Range(区域)
    277     ExcelRange.AttachDispatch(ExcelSheet.get_UsedRange(), TRUE);
    278 
    279     //获得使用的行数
    280     long lgUsedRowNum = 1;
    281     ExcelRange.AttachDispatch(ExcelRange.get_Rows(), TRUE);
    282     lgUsedRowNum = ExcelRange.get_Count();
    283 
    284     return lgUsedRowNum;
    285 }
    286 
    287 
    288 
    289 int ExcelApi::GetColumnNum()
    290 {
    291     if (IsOpenBook != true)
    292     {
    293         AfxMessageBox("请先打开工作簿!");
    294         return 0;
    295     }
    296 
    297     //获得使用的区域Range(区域)
    298     ExcelRange.AttachDispatch(ExcelSheet.get_UsedRange(), TRUE);
    299 
    300     //获得使用的列数
    301     long lgUsedColumnNum = 1;
    302     ExcelRange.AttachDispatch(ExcelRange.get_Columns(), TRUE);
    303     lgUsedColumnNum = ExcelRange.get_Count();
    304 
    305     return lgUsedColumnNum;
    306 }
    307 
    308 
    309 void ExcelApi::DeleteRange(char* A1, char* B1, int type)
    310 {
    311     //方法1    
    312     //ExcelRange.AttachDispatch(ExcelSheet.get_Range(COleVariant(_T(A1)), COleVariant(_T(B1))), TRUE);//设置单元格区域
    313     //ExcelRange.AttachDispatch(ExcelRange.get_EntireRow());//获取这一行
    314     //ExcelRange.Delete(vtMissing);//删除这一行
    315 
    316     //方法2
    317     ExcelRange.AttachDispatch(ExcelSheet.get_Range(COleVariant(_T(A1)), COleVariant(_T(B1))), TRUE);//设置单元格区域
    318     ExcelRange.Delete(COleVariant((long)type));//设置删除类型1.右侧单元格左移 2.下方单元格上移 3.整行 4.整列
    319 }
    320 
    321 void ExcelApi::AddRange(char* A1, char* B1, int type)
    322 {
    323     //方法1
    324     //ExcelRange.AttachDispatch(ExcelSheet.get_Range(COleVariant(_T("F3")), COleVariant(_T("G3"))), TRUE);//设置单元格区域
    325     //ExcelRange.AttachDispatch(ExcelRange.get_EntireRow());//获取这一行
    326     //ExcelRange.Insert(vtMissing, vtMissing);//在上面添加新一行
    327 
    328     //方法2
    329     ExcelRange.AttachDispatch(ExcelSheet.get_Range(COleVariant(_T(A1)), COleVariant(_T(B1))), TRUE);//设置单元格区域
    330     //   ExcelRange.Insert(COleVariant((long)type), vtMissing);//设置添加类型1.活动单元格右移 2.活动单元格下移 3.整行 4.整列
    331 
    332 }
    333 
    334 
    335 void ExcelApi::SetFont(char* A1, char* B1, char* FontType, int FontColor, int FontSize)
    336 {
    337     //设置字体颜色
    338     ExcelRange.AttachDispatch(ExcelSheet.get_Range(COleVariant(_T(A1)), COleVariant(_T(B1))), TRUE);//设置单元格区域
    339     ft.AttachDispatch(ExcelRange.get_Font());
    340     ft.put_Name(COleVariant(_T(FontType)));//设置字体类型
    341     ft.put_ColorIndex(COleVariant((long)FontColor));//设置字体颜色    
    342     ft.put_Size(COleVariant((long)FontSize));//设置字体大小
    343 }
    344 
    345 void ExcelApi::SetRangeColor(char* A1, char* B1, int RangeColor)
    346 {
    347     //设置单元格颜色
    348     ExcelRange.AttachDispatch(ExcelSheet.get_Range(COleVariant(_T(A1)), COleVariant(_T(B1))), TRUE);//设置单元格区域
    349 
    350     //设置单元格填充颜色
    351     it.AttachDispatch(ExcelRange.get_Interior());
    352     it.put_ColorIndex(_variant_t((long)RangeColor));
    353 }
    354 
    355 
    356 void ExcelApi::CycleFontTypeColorSizeAndRangeColor(char* FontType, int FontColor, int FontSize, int RangeColor)
    357 {
    358     //获得使用的区域Range(区域)
    359     ExcelRange.AttachDispatch(ExcelSheet.get_UsedRange(), TRUE);
    360 
    361     //获得使用的行数
    362     long lgUsedRowNum = 1;
    363     ExcelRange.AttachDispatch(ExcelRange.get_Rows(), TRUE);
    364     lgUsedRowNum = ExcelRange.get_Count();
    365 
    366     //获得使用的列数
    367     long lgUsedColumnNum = 1;
    368     ExcelRange.AttachDispatch(ExcelRange.get_Columns(), TRUE);
    369     lgUsedColumnNum = ExcelRange.get_Count();
    370 
    371     vector<CString> delete_all;
    372     //遍历整个Excel表格
    373     for (int j = 1; j <= lgUsedRowNum; j++)
    374     {
    375         for (int i = 1; i <= lgUsedColumnNum; i++)
    376         {
    377             CString str1;
    378             str1.Format("%c%d", 65 + i - 1, j);
    379             //LPDISPATCH lpDisp = ExcelRange.get_Range(COleVariant(str1), COleVariant(str1));
    380 
    381             //设置字体颜色
    382             ExcelRange.AttachDispatch(ExcelSheet.get_Range(COleVariant(_T(str1)), COleVariant(_T(str1))), TRUE);//设置单元格区域
    383             ft.AttachDispatch(ExcelRange.get_Font());
    384             //读取字体颜色
    385             VARIANT vResult1 = ft.get_ColorIndex();
    386             CString str0;
    387             if (vResult1.vt == VT_I4)str0.Format(_T("%d"), vResult1.iVal);    // 8字节的整数
    388 
    389             //读取字体类型
    390             VARIANT vResult2 = ft.get_Name();
    391             CString str2;
    392             if (vResult2.vt == VT_BSTR)str2 = vResult2.bstrVal;
    393 
    394             //读取字体大小
    395             VARIANT vResult3 = ft.get_Size();
    396             CString str3;
    397             if (vResult3.vt == VT_R8)str3.Format(_T("%0.0f"), vResult3.dblVal);    // 8字节的整数
    398 
    399             //设置单元格颜色
    400             ExcelRange.AttachDispatch(ExcelSheet.get_Range(COleVariant(_T(str1)), COleVariant(_T(str1))), TRUE);//设置单元格区域
    401             it.AttachDispatch(ExcelRange.get_Interior());
    402             //读取单元格填充颜色
    403             VARIANT vResult4 = it.get_ColorIndex();
    404             CString str4;
    405             if (vResult4.vt == VT_I4)str4.Format(_T("%d"), vResult4.iVal);    // 8字节的整数
    406 
    407             //Cstring转char*
    408             char *p = (LPSTR)(LPCTSTR)str0;
    409             int AA = atoi(p);
    410 
    411             //Cstring转char*
    412             char *p1 = (LPSTR)(LPCTSTR)str3;
    413             int AA1 = atoi(p1);
    414 
    415             //Cstring转char*
    416             char *p2 = (LPSTR)(LPCTSTR)str4;
    417             int AA2 = atoi(p2);
    418 
    419             //添加到vector
    420             if (AA == FontColor && AA1 == FontSize && str2 == FontType && AA2 == RangeColor)
    421             {
    422                 delete_all.push_back(str1);
    423             }
    424 
    425         }
    426 
    427     }
    428 
    429     for (int i = 0; i < delete_all.size(); i++)
    430     {
    431         //方法2
    432         ExcelRange.AttachDispatch(ExcelSheet.get_Range(COleVariant(_T(delete_all[i])), COleVariant(_T(delete_all[i]))), TRUE);//设置单元格区域
    433         ExcelRange.Delete(COleVariant((long)2));//设置删除类型1.右侧单元格左移 2.下方单元格上移 3.整行 4.整列
    434 
    435         //添加单元格,补充进去
    436         //方法2
    437         ExcelRange.AttachDispatch(ExcelSheet.get_Range(COleVariant(_T(delete_all[i])), COleVariant(_T(delete_all[i]))), TRUE);//设置单元格区域
    438         ExcelRange.Insert(COleVariant((long)2), vtMissing);//设置添加类型1.活动单元格右移 2.活动单元格下移 3.整行 4.整列
    439     }
    440 
    441 }
    442 
    443 
    444 
    445 void ExcelApi::CycleRangeSetData(char* CycleName, char* NewName)
    446 {
    447     //获得使用的区域Range(区域)
    448     ExcelRange.AttachDispatch(ExcelSheet.get_UsedRange(), TRUE);
    449 
    450     //获得使用的行数
    451     long lgUsedRowNum = 1;
    452     ExcelRange.AttachDispatch(ExcelRange.get_Rows(), TRUE);
    453     lgUsedRowNum = ExcelRange.get_Count();
    454 
    455     //获得使用的列数
    456     long lgUsedColumnNum = 1;
    457     ExcelRange.AttachDispatch(ExcelRange.get_Columns(), TRUE);
    458     lgUsedColumnNum = ExcelRange.get_Count();
    459 
    460     //遍历整个Excel表格
    461     for (int j = 1; j <= lgUsedRowNum; j++)
    462     {
    463         for (int i = 1; i <= lgUsedColumnNum; i++)
    464         {
    465             CString str;
    466             str.Format("%c%d", 65 + i - 1, j);
    467             LPDISPATCH lpDisp = ExcelRange.get_Range(COleVariant(str), COleVariant(str));
    468 
    469             CRange range;
    470             range.AttachDispatch(lpDisp);
    471 
    472             VARIANT vl = range.get_Value2();
    473 
    474             CString text;
    475             CString text1 = CycleName;
    476             if (vl.vt == VT_BSTR)       //字符串
    477             {
    478                 text = vl.bstrVal;
    479                 if (text == text1)
    480                 {
    481                     //得到全部Cells,此时,userRange是cells的集合
    482                     range.AttachDispatch(ExcelSheet.get_Cells(), TRUE);
    483 
    484                     //设置表格内容
    485                     range.put_Item(COleVariant((long)j), COleVariant((long)i), COleVariant(_T(NewName)));
    486 
    487                 }
    488 
    489             }
    490         }
    491 
    492     }
    493 
    494 }
    495 
    496 
    497 
    498 
    499 vector<string> ExcelApi::CycleRangeReturnRowColumn(char* CycleName)
    500 {
    501     //创建vector
    502     vector<string> RowColumnAll;
    503 
    504     //先清空vector
    505     RowColumnAll.clear();
    506 
    507     //获得使用的区域Range(区域)
    508     ExcelRange.AttachDispatch(ExcelSheet.get_UsedRange(), TRUE);
    509 
    510     //获得使用的行数
    511     long lgUsedRowNum = 1;
    512     ExcelRange.AttachDispatch(ExcelRange.get_Rows(), TRUE);
    513     lgUsedRowNum = ExcelRange.get_Count();
    514 
    515     //获得使用的列数
    516     long lgUsedColumnNum = 1;
    517     ExcelRange.AttachDispatch(ExcelRange.get_Columns(), TRUE);
    518     lgUsedColumnNum = ExcelRange.get_Count();
    519 
    520     //遍历整个Excel表格
    521     for (int j = 1; j <= lgUsedRowNum; j++)
    522     {
    523         for (int i = 1; i <= lgUsedColumnNum; i++)
    524         {
    525             CString str;
    526             str.Format("%c%d", 65 + i - 1, j);
    527             LPDISPATCH lpDisp = ExcelRange.get_Range(COleVariant(str), COleVariant(str));
    528 
    529             CRange range;
    530             range.AttachDispatch(lpDisp);
    531 
    532             VARIANT vl = range.get_Value2();
    533 
    534             CString text;
    535             CString text1 = CycleName;
    536             if (vl.vt == VT_BSTR)       //字符串
    537             {
    538                 text = vl.bstrVal;
    539                 if (text == text1)
    540                 {
    541                     //得到全部Cells,此时,userRange是cells的集合
    542                     range.AttachDispatch(ExcelSheet.get_Cells(), TRUE);
    543 
    544                     //得到行和列
    545                     //转换
    546                     char msg[256];
    547                     sprintf_s(msg, "%d", j);
    548                     string AA = msg;
    549 
    550                     char msg1[256];
    551                     sprintf_s(msg1, "%d", i);
    552                     string BB = msg1;
    553 
    554                     //字符串拼接
    555                     string RowColumn = AA + "," + BB;
    556 
    557                     //添加到vector
    558                     RowColumnAll.push_back(RowColumn);
    559                 }
    560             }
    561         }
    562     }
    563 
    564     return RowColumnAll;
    565 }
    566 
    567 
    568 void ExcelApi::ShuaValue(const char* CycleName, const char* NewName1, const char* NewName2, const char* NewName3, const char* NewName4, const char* NewName5, const char* NewName6, const char* NewName7, const char* NewName8)
    569 {
    570     //获得使用的区域Range(区域)
    571     ExcelRange.AttachDispatch(ExcelSheet.get_UsedRange(), TRUE);
    572 
    573     //获得使用的行数
    574     long lgUsedRowNum = 1;
    575     ExcelRange.AttachDispatch(ExcelRange.get_Rows(), TRUE);
    576     lgUsedRowNum = ExcelRange.get_Count();
    577 
    578     //获得使用的列数
    579     long lgUsedColumnNum = 1;
    580     ExcelRange.AttachDispatch(ExcelRange.get_Columns(), TRUE);
    581     lgUsedColumnNum = ExcelRange.get_Count();
    582 
    583     //遍历整个Excel表格
    584     for (int j = 1; j <= lgUsedRowNum; j++)
    585     {
    586         for (int i = 1; i <= lgUsedColumnNum; i++)
    587         {
    588             CString str;
    589             str.Format("%c%d", 65 + i - 1, j);
    590             LPDISPATCH lpDisp = ExcelRange.get_Range(COleVariant(str), COleVariant(str));
    591 
    592             CRange range;
    593             range.AttachDispatch(lpDisp);
    594 
    595             VARIANT vl = range.get_Value2();
    596 
    597             CString text;
    598             CString text1 = CycleName;
    599             if (vl.vt == VT_BSTR)       //字符串
    600             {
    601                 text = vl.bstrVal;
    602                 if (text == text1)
    603                 {
    604                     if (i == 6)
    605                     {
    606                         //得到全部Cells,此时,userRange是cells的集合
    607                         range.AttachDispatch(ExcelSheet.get_Cells(), TRUE);
    608 
    609                         //设置表格内容
    610                         range.put_Item(COleVariant((long)j), COleVariant((long)i), COleVariant(_T(NewName1)));
    611                         range.put_Item(COleVariant((long)j), COleVariant((long)i + 1), COleVariant(_T(NewName2)));
    612                         range.put_Item(COleVariant((long)j), COleVariant((long)i + 2), COleVariant(_T(NewName3)));
    613                         range.put_Item(COleVariant((long)j), COleVariant((long)i + 3), COleVariant(_T(NewName4)));
    614                         range.put_Item(COleVariant((long)j), COleVariant((long)i + 4), COleVariant(_T(NewName5)));
    615                         range.put_Item(COleVariant((long)j), COleVariant((long)i + 5), COleVariant(_T(NewName6)));
    616                         //range.put_Item(COleVariant((long)j), COleVariant((long)i + 6), COleVariant(_T(NewName7)));
    617                         //range.put_Item(COleVariant((long)j), COleVariant((long)i + 7), COleVariant(_T(NewName8)));
    618 
    619                         //转换
    620                         char F[256];
    621                         sprintf_s(F, "F%d", j);
    622 
    623                         char M[256];
    624                         sprintf_s(M, "M%d", j);
    625 
    626                         //设置字体颜色
    627                         range.AttachDispatch(ExcelSheet.get_Range(COleVariant(_T(F)), COleVariant(_T(M))), TRUE);
    628                         ft.AttachDispatch(range.get_Font());
    629                         ft.put_Name(COleVariant(_T("宋体")));
    630                         ft.put_ColorIndex(COleVariant((long)1));    //颜色    
    631                         ft.put_Size(COleVariant((long)11));         //大小
    632 
    633                         //设置单元格填充颜色
    634                         it.AttachDispatch(range.get_Interior());
    635                         //                        it.put_ColorIndex(_variant_t((long)39));
    636                     }
    637 
    638 
    639                 }
    640 
    641             }
    642         }
    643 
    644     }
    645 
    646 
    647 }
    648 
    649 
    650 
    651 
    652 
    653 void ExcelApi::DeleteSheetRange()
    654 {
    655     //获得使用的区域Range(区域)
    656     ExcelRange.AttachDispatch(ExcelSheet.get_UsedRange(), TRUE);
    657 
    658     //获得使用的行数
    659     long lgUsedRowNum = 1;
    660     ExcelRange.AttachDispatch(ExcelRange.get_Rows(), TRUE);
    661     lgUsedRowNum = ExcelRange.get_Count();
    662 
    663     //获得使用的列数
    664     long lgUsedColumnNum = 1;
    665     ExcelRange.AttachDispatch(ExcelRange.get_Columns(), TRUE);
    666     lgUsedColumnNum = ExcelRange.get_Count();
    667 
    668     char msg[256];
    669     sprintf_s(msg, "M%d", lgUsedRowNum);
    670 
    671     //方法2
    672     ExcelRange.AttachDispatch(ExcelSheet.get_Range(COleVariant(_T("A1")), COleVariant(_T(msg))), TRUE);//设置单元格区域
    673     ExcelRange.Delete(COleVariant((long)3));//设置删除类型1.右侧单元格左移 2.下方单元格上移 3.整行 4.整列
    674 
    675 }
    676 
    677 
    678 
    679 void ExcelApi::SetRangeBorder(int LineType)
    680 {
    681     //获得使用的区域Range(区域)
    682     ExcelRange.AttachDispatch(ExcelSheet.get_UsedRange(), TRUE);
    683 
    684     //获得使用的行数
    685     long lgUsedRowNum = 1;
    686     ExcelRange.AttachDispatch(ExcelRange.get_Rows(), TRUE);
    687     lgUsedRowNum = ExcelRange.get_Count();
    688 
    689     //获得使用的列数
    690     long lgUsedColumnNum = 1;
    691     ExcelRange.AttachDispatch(ExcelRange.get_Columns(), TRUE);
    692     lgUsedColumnNum = ExcelRange.get_Count();
    693 
    694     //画边框线
    695     VARIANT vRange1, vRange2, vRange3, vRange4, vRange5;
    696     VariantInit(&vRange1);
    697     VariantInit(&vRange2);
    698     VariantInit(&vRange3);
    699     VariantInit(&vRange4);
    700     VariantInit(&vRange5);
    701     vRange1.vt = VT_I2;
    702     vRange1.lVal = LineType;   // 线的样式:0- no line; 1-solid; 2-big dot;3-small dot;4-dash dot; 5-dash dot dot;
    703     vRange2.vt = VT_I2;
    704     vRange2.lVal = 2;  // 线的粗细程度;
    705     vRange3.vt = VT_I2;
    706     vRange3.lVal = 1;   // 1-black;2-white;3-red;4-green;5-blue; 6-yellow; 7-pink;8-dark blue;
    707     vRange4.vt = VT_UI4;
    708     vRange4.uintVal = RGB(0, 0, 0);  // 我测试后认为,没有实际意义,只有vRange3起作用
    709     vRange5.vt = VT_I2;
    710     vRange5.lVal = 1;
    711 
    712     //遍历整个Excel表格
    713     for (int j = 1; j <= lgUsedRowNum; j++)
    714     {
    715         for (int i = 1; i <= lgUsedColumnNum; i++)
    716         {
    717             CString str;
    718             str.Format("%c%d", 65 + i - 1, j);
    719             LPDISPATCH lpDisp = ExcelRange.get_Range(COleVariant(str), COleVariant(str));
    720 
    721             CRange range;
    722             range.AttachDispatch(lpDisp);
    723 
    724             //画边框线
    725             range.BorderAround(vRange1, vRange2.lVal, vRange3.lVal, vRange4, vRange5);
    726 
    727         }
    728 
    729     }
    730 
    731 }
    732 
    733 
    734 
    735 void ExcelApi::SetRangeMerge(char* A1, char* B1)
    736 {
    737     ExcelRange.AttachDispatch(ExcelSheet.get_Range(COleVariant(_T(A1)), COleVariant(_T(B1))), TRUE);//设置单元格区域
    738     ExcelRange.Merge(COleVariant((long)0));
    739 }
    740 
    741 
    742 
    743 void ExcelApi::SetRangeUnMerge(char* A1, char* B1)
    744 {
    745     ExcelRange.AttachDispatch(ExcelSheet.get_Range(COleVariant(_T(A1)), COleVariant(_T(B1))), TRUE);//设置单元格区域
    746     ExcelRange.UnMerge();
    747 }
    748 
    749 
    750 
    751 void ExcelApi::ClearContents(char* A1, char* B1)
    752 {
    753     ExcelRange.AttachDispatch(ExcelSheet.get_Range(COleVariant(_T(A1)), COleVariant(_T(B1))), TRUE);//设置单元格区域
    754     ExcelRange.ClearContents();
    755 }
    756 
    757 
    758 
    759 void ExcelApi::SetFontHorizontalAlignment(int type)
    760 {
    761     //获得使用的区域Range(区域)
    762     ExcelRange.AttachDispatch(ExcelSheet.get_UsedRange(), TRUE);
    763 
    764     int num = 0;
    765     if (type == 1)
    766     {
    767         num = -4108;
    768     }
    769     else if (true)
    770     {
    771         num = -4131;
    772     }
    773     else if (true)
    774     {
    775         num = -4152;
    776     }
    777     //设置对齐方式
    778     //水平对齐:默认 1 居中 -4108, 左= -4131,右=-4152
    779     //垂直对齐:默认 2 居中 -4108, 左= -4160,右=-4107
    780     //ExcelRange.put_VerticalAlignment(COleVariant((long)-4108));
    781     ExcelRange.put_HorizontalAlignment(COleVariant((long)num));
    782 
    783 }
    784 
    785 
    786 void ExcelApi::SetRangeSetting()
    787 {
    788     //获得使用的区域Range(区域)
    789     ExcelRange.AttachDispatch(ExcelSheet.get_UsedRange(), TRUE);
    790 
    791     //设置单元格格式为文本
    792     ExcelRange.put_NumberFormatLocal(COleVariant("@"));
    793 
    794 }
    795 
    796 
    797 void ExcelApi::AddPicture(const char* Filename, long LinkToFile, long SaveWithDocument, float Left, float Top, float Width, float Height)
    798 {
    799     //获得使用的区域
    800     shp.AttachDispatch(ExcelSheet.get_Shapes());
    801 
    802     //插入图片
    803     shp.AddPicture(Filename,LinkToFile,SaveWithDocument,Left,Top,Width,Height);
    804 }
    View Code

    stdafx.h

     1 // stdafx.h : 标准系统包含文件的包含文件,
     2 // 或是经常使用但不常更改的
     3 // 特定于项目的包含文件
     4 
     5 #pragma once
     6 
     7 #ifndef VC_EXTRALEAN
     8 #define VC_EXTRALEAN            // 从 Windows 头中排除极少使用的资料
     9 #endif
    10 
    11 //#include "targetver.h"
    12 
    13 #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // 某些 CString 构造函数将是显式的
    14 
    15 // 关闭 MFC 对某些常见但经常可放心忽略的警告消息的隐藏
    16 #define _AFX_ALL_WARNINGS
    17 
    18 #include <afxwin.h>         // MFC 核心组件和标准组件
    19 #include <afxext.h>         // MFC 扩展
    20 
    21 
    22 #include <afxdisp.h>        // MFC 自动化类
    23 
    24 
    25 
    26 #ifndef _AFX_NO_OLE_SUPPORT
    27 #include <afxdtctl.h>           // MFC 对 Internet Explorer 4 公共控件的支持
    28 #endif
    29 #ifndef _AFX_NO_AFXCMN_SUPPORT
    30 #include <afxcmn.h>             // MFC 对 Windows 公共控件的支持
    31 #endif // _AFX_NO_AFXCMN_SUPPORT
    32 
    33 #include <afxcontrolbars.h>     // 功能区和控件条的 MFC 支持
    34 
    35 
    36 
    37 
    38 
    39 
    40 
    41 
    42 
    43 #ifdef _UNICODE
    44 #if defined _M_IX86
    45 #pragma comment(linker,"/manifestdependency:"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'"")
    46 #elif defined _M_X64
    47 #pragma comment(linker,"/manifestdependency:"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'"")
    48 #else
    49 #pragma comment(linker,"/manifestdependency:"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'"")
    50 #endif
    51 #endif
    View Code

    stdafx.cpp

    1 // stdafx.cpp : 只包括标准包含文件的源文件
    2 // MFCApplication1.pch 将作为预编译头
    3 // stdafx.obj 将包含预编译类型信息
    4 
    5 #include "stdafx.h"
    View Code

    调用

    ExcelApi *SetExcelApi = new ExcelApi();

  • 相关阅读:
    一位测友的真实面试题
    内部cms系统测试
    po模式
    描述器
    monkey命令
    进程管理工具supervisor
    webpack打包绝对路径引用资源和element ui字体图标不显示的解决办法
    pycharm flask debug调试接口
    应对ADT(Eclipse)的No more handles解决办法
    收集整理Android开发所需的Android SDK、开发中用到的工具、Android开发教程、Android设计规范,免费的设计素材等。
  • 原文地址:https://www.cnblogs.com/nxopen2018/p/11055161.html
Copyright © 2020-2023  润新知