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

你可能感兴趣的:(EXCEL2016 OLE/COM开发-常用功能封装代码)