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 };
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 }
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
stdafx.cpp

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