https://blog.csdn.net/ywx123_/article/details/77074038
VS2010對Excel讀寫操作
一、開發環境
程式設計環境 VS2010
office版本 office 2010
注意 :這裡office版本号不一定非得和vs版本号一緻。
二、基本實作功能
基本實作對Excel的讀寫
建立一個表格,并向裡面寫入内容
三、基本操作步驟
1. 建立一個基于MFC的對話框工程。
如下圖。注意:勾選基本對話框。預設編碼方式使用的是Unicode庫,在對字元操作時需要将char轉化為TCHAR,一般用_T(“xxx”)即可。(vc6 預設不是uicode這點需要差別)
圖1
其餘選擇,預設直接點選完成即可。生成一個基本對話框如圖2。
圖2
将上面的預設控件删除。
2. 導入Excel類庫
從office安裝目錄下找到EXCEL.exe(D:\Program Files(x86)\Microsoft Office\Office14),在VS2010中添加類庫(從類庫中添加)類向導->添加類->從類庫中添加。如圖3、圖4
圖3
圖4
依次從接口:_Application、_Workbook、_Worksheet、Workbooks、Worksheets、Font、Range(暫時隻用到這些)生成對應的類(CApplication 、CWorkbook、CWorksheet、CWorkbook、Cworksheets、CFont0、CRange)如圖5所示。點選确定,總生成對應.h、.cpp檔案并添加到工程。
圖5
在所建對話框添加一個按鈕,名字修改為導出EXCEL,ID修改為IDC_BTN_EXCEL,添加一個消息消息函數(這裡為OnBtnExcel())。
3. 解決導入工程後的編譯錯誤。
在stdafx.h中包含,以上頭檔案,編譯。
#include "CApplication.h"
#include "CFont0.h"
#include "CRange.h"
#include "CWorkbook.h"
#include "CWorkbooks.h"
#include "CWorksheet.h"
#include "CWorksheets.h"
1
2
3
4
5
6
7
屏蔽掉導入每個頭檔案下的//#import “D:\Program Files (x86)\Microsoft Office\Office14\EXCEL.EXE” no_namespace
編譯出現1>c:\users\desktop\exceltest\crange.h(335): warning C4003: “DialogBoxW”宏的實參不足。将DialogBox修改為_DialogBox。
4. 執行個體代碼。
在CExcelTestApp的InitInstance初始化com元件,添加COM/OLE支援
if(CoInitialize(NULL)!=0)
{
AfxMessageBox(_T("初始化失敗"));
}
1
2
3
4
同時在ExitInstance裡釋放資源
CoUninitialize(); //釋放com資源
1
在對話框的按鈕事件實作導出EXCEL。
void CExcelTestDlg::OnBtnExcel()
{
//1.建立基本對象
CApplication App; //建立應用程式執行個體
CWorkbooks Books; //工作簿,多個Excel檔案
CWorkbook Book; //單個工作簿
CWorksheets sheets;//多個sheet頁面
CWorksheet sheet; //單個sheet頁面
CRange range; //操作單元格
//2.打開指定Excel檔案,如果不存在就建立
char path[MAX_PATH];
GetCurrentDirectory(MAX_PATH,(TCHAR*)path);//擷取目前路徑
CString strExcelFile =(TCHAR*) path;
CString strdevName = _T("\\Test.xlsx"); //xls也行
strExcelFile += strdevName;
COleVariant
covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
LPDISPATCH lpdisp = NULL;
//1.建立Excel執行個體
if(!App.CreateDispatch(_T("Excel.Application"),NULL))
{
AfxMessageBox(_T("建立Excel執行個體失敗"));
exit(-1);
}
else
{
AfxMessageBox(_T("建立成功"));
}
App.put_Visible(TRUE); //打開Excel
App.put_UserControl(FALSE);
//2. 得到workbooks容器
Books.AttachDispatch(App.get_Workbooks());
Book.AttachDispatch(Books.Add(covOptional));
sheets.AttachDispatch(Book.get_Worksheets());
sheet.AttachDispatch(sheets.get_Item(COleVariant((short)1))); //擷取sheet1
sheet.put_Name(_T("TestName")); //設定sheet1名字
//3. 加載要合并的單元格
range.AttachDispatch(sheet.get_Range(COleVariant(_T("B2")),COleVariant(_T("E2"))),TRUE);
range.Merge(COleVariant((long)0)); //合并單元格
//4. 設定表格内容
range.AttachDispatch(sheet.get_Cells(),TRUE); //加載所有單元格
range.put_Item(COleVariant((long)2),COleVariant((long)2),COleVariant(_T("電氣工程及其自動化課程統計")));
range.put_Item(COleVariant((long)3),COleVariant((long)2),COleVariant(_T("課程名稱")));
range.put_Item(COleVariant((long)3),COleVariant((long)3),COleVariant(_T("課時")));
range.put_Item(COleVariant((long)3),COleVariant((long)4),COleVariant(_T("難度")));
range.put_Item(COleVariant((long)3),COleVariant((long)5),COleVariant(_T("教學方式")));
range.put_Item(COleVariant((long)4),COleVariant((long)2),COleVariant(_T("電磁場")));
range.put_Item(COleVariant((long)4),COleVariant((long)3),COleVariant(_T("30")));
range.put_Item(COleVariant((long)4),COleVariant((long)4),COleVariant(_T("變态難")));
range.put_Item(COleVariant((long)4),COleVariant((long)5),COleVariant(_T("老師講課")));
range.put_Item(COleVariant((long)5),COleVariant((long)2),COleVariant(_T("電機學")));
range.put_Item(COleVariant((long)5),COleVariant((long)3),COleVariant(_T("40")));
range.put_Item(COleVariant((long)5),COleVariant((long)4),COleVariant(_T("難")));
range.put_Item(COleVariant((long)5),COleVariant((long)5),COleVariant(_T("老師講課加實驗")));
range.put_Item(COleVariant((long)6),COleVariant((long)2),COleVariant(_T("PLC")));
range.put_Item(COleVariant((long)6),COleVariant((long)3),COleVariant(_T("20")));
range.put_Item(COleVariant((long)6),COleVariant((long)4),COleVariant(_T("普通")));
range.put_Item(COleVariant((long)6),COleVariant((long)5),COleVariant(_T("老師講課加實驗")));
//range.put_Item(COleVariant((long)7),COleVariant((long)2),COleVariant(_T("電力系統")));
//range.put_Item(COleVariant((long)7),COleVariant((long)3),COleVariant(_T("50")));
//range.put_Item(COleVariant((long)7),COleVariant((long)4),COleVariant(_T("難")));
//range.put_Item(COleVariant((long)7),COleVariant((long)5),COleVariant(_T("老師講課加實驗")));
range.AttachDispatch(sheet.get_UsedRange());//加載已使用的單元格
range.put_WrapText(COleVariant((long)1)); //設定文本自動換行
//5.設定對齊方式
//水準對齊:預設 1 居中 -4108, 左= -4131,右=-4152
//垂直對齊:預設 2 居中 -4108, 左= -4160,右=-4107
range.put_VerticalAlignment(COleVariant((long)-4108));
range.put_HorizontalAlignment(COleVariant((long)-4108));
//6.設定字型顔色
CFont0 ft;
ft.AttachDispatch(range.get_Font());
ft.put_Name(COleVariant(_T("楷體"))); //字型
ft.put_ColorIndex(COleVariant((long)1));//顔色 //黑色
ft.put_Size(COleVariant((long)12)); //大小
range.AttachDispatch(sheet.get_Range(COleVariant(_T("B2")),COleVariant(_T("E2"))),TRUE);
ft.AttachDispatch(range.get_Font());
ft.put_Name(COleVariant(_T("華文行楷")));
ft.put_Bold(COleVariant((long)1));
ft.put_ColorIndex(COleVariant((long)5)); //顔色
ft.put_Size(COleVariant((long)18)); //大小
Book.SaveCopyAs(COleVariant(strExcelFile)); //儲存
Book.put_Saved(TRUE);
//8.釋放資源
range.ReleaseDispatch();
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
Book.ReleaseDispatch();
Books.ReleaseDispatch();
App.ReleaseDispatch();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
5. 最終效果
圖6
四、基本原理介紹
一般操作Excel步驟
建立一個Excel應用程式 app
得到Workbooks容器
打開一個workbook或者建立一個workbook
得到workbook的worksheets容器
打開一個worksheet或者建立一個worksheet
通過Range對worksheet裡的單元格進行讀寫操作。
儲存Excel釋放資源
五、參考文獻
http://blog.csdn.net/xiaoxiangyuan123456/article/details/70941588
http://m.blog.csdn.net/Augusdi/article/details/5782575
---------------------
作者:ywx123_
來源:CSDN
原文:https://blog.csdn.net/ywx123_/article/details/77074038
版權聲明:本文為部落客原創文章,轉載請附上博文連結!