天天看點

VS2010 對Excel讀寫操作

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 

版權聲明:本文為部落客原創文章,轉載請附上博文連結!