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 #include15 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 };
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 vectordelete_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 }
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
stdafx.cpp
1 // stdafx.cpp : 只包括标准包含文件的源文件 2 // MFCApplication1.pch 将作为预编译头 3 // stdafx.obj 将包含预编译类型信息 4 5 #include "stdafx.h"
调用
ExcelApi *SetExcelApi = new ExcelApi();