1. 程式人生 > >windows 平臺下 xlnt 結合visual studio 2017 用c++操作excel

windows 平臺下 xlnt 結合visual studio 2017 用c++操作excel

安裝cmake

Windows下載安裝xlnt

git clone https://github.com/tfussell/xlnt.git
cd xlnt
mkdir build
# git clone剛才下載的xlnt原始碼位置 F:\CODE\CPPCODE\xlnt
# 如果下載的zip檔案  原始碼位置 F:\CODE\CPPCODE\xlnt-master 
# cd xlnt-master 
# mkdir build
# 我直接下載的zip檔案 所以我的xlnt原始碼地址是  F:\CODE\CPPCODE\xlnt-master 

Cmake編譯xlnt

1.開啟Cmake(Gui)

在這裡插入圖片描述

 在where is souce codedir 放xlnt原始碼地址  ( F:\CODE\CPPCODE\xlnt-maste )

 在在where build the ... 放你 新建的 build 資料夾地址(F:/CODE/CPPCODE/xlnt-master/build)

2.點選左下角 config

在這裡插入圖片描述

選中你的visual Studio 版本 下拉選中電腦版本的vs (預設是32位的 64位visual Stdio需要自己選擇)  
--> finish

在這裡插入圖片描述

3.設定完成之後點選 Generate

4. 生成之後點選openProject

5.在VS中點選 本地偵錯程式 ()等專案生成完成

PS: 專案在visual stdudio 本地偵錯程式生成解決方案
會彈窗跳出警告 無法啟動程式 請無視
 在 xlnt-master\include中得到標頭檔案資料夾

 在 xlnt-master\build\source\Debug中得到動態連結庫 
動態連結庫中有  xlntd.dll  xlntd.lib 這是需要用到的東西 

如果沒有xlntd.dll就是沒編譯好 請重試

visual studio2017 專案中引入xlnt

配置xlnt 到你的專案

專案右鍵點選它,然後選擇最下方的屬性按鈕,開啟配置的視窗

  1. 配置標頭檔案路徑的配置 配置屬性-VC++目錄-引用目錄 填入 xlnt-master\include
  2. 第三方庫庫檔案路徑 配置屬性-VC++目錄-庫目錄 填入 xlnt-master\build\source\Debug
  3. 引用庫名稱的配置

配置屬性-聯結器-依賴-附加依賴項 填入 xlntd.lib 4. 配置完之後 複製xlntd.dll放到你的專案資料夾中去 (將xlnt-master\include下的 xlnt資料夾也複製到專案中去)

以下是visual 2017 使用xlnt 生成excel的示例專案

環境 win10 64位 VS2017 64位 cmake 3.12.2 64位

1.生成空的專案

vs2017 檔案->新建–>其他–>空專案–>ddxls(C:\Users\Administrator\source\repos\ddxls)

  • 新增demo.cpp檔案
    • 專案–>右鍵–>新增新項 -->demo.cpp

2.給專案配置xlnt

- 專案右鍵點選,然後選擇最下方的屬性按鈕,開啟配置的視窗
- 1. 配置標頭檔案路徑的配置
    配置屬性-VC++目錄-引用目錄
    填入 xlnt-master\include
- 2. 第三方庫庫檔案路徑
    配置屬性-VC++目錄-庫目錄
    填入 xlnt-master\build\source\Debug
- 3. 引用庫名稱的配置 
配置屬性-聯結器-依賴-附加依賴項
填入 xlntd.lib

- 4.給專案新增動態連結庫
 複製xlntd.dll放到你的專案資料夾中去 (將xlnt-master\include下的 xlnt資料夾也複製到專案資料夾"C:\Users\Administrator\source\repos\ddxls\ddxls中去"
3.在demo.cpp新增程式碼

#include <iostream>
#include "xlnt/xlnt.hpp"
#include <string.h>
#include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS
#include <vector>
#include <string>

int main()
{
	//Creating a 2 dimensional vector which we will write values to
	std::vector< std::vector<std::string> > wholeWorksheet;
	//Looping through each row (100 rows as per the second argument in the for loop)
	for (int outer = 0; outer < 100; outer++)
	{
		//Creating a fresh vector for a fresh row
		std::vector<std::string> singleRow;
		//Looping through each of the columns (100 as per the second argument in the for loop) in this particular row
		for (int inner = 0; inner < 100; inner++)
		{
			//Adding a single value in each cell of the row 
			std::string val = std::to_string(inner + 1);
			singleRow.push_back(val);
		}
		//Adding the single row to the 2 dimensional vector
		wholeWorksheet.push_back(singleRow);
		std::clog << "Writing to row " << outer << " in the vector " << std::endl;
	}
	//Writing to the spread sheet
	//Creating the output workbook 
	std::clog << "Creating workbook" << std::endl;
	xlnt::workbook wbOut;
	//Setting the destination output file name
	std::string dest_filename = "output.xlsx";
	//Creating the output worksheet
	xlnt::worksheet wsOut = wbOut.active_sheet();
	//Giving the output worksheet a title/name
	wsOut.title("data");
	//We will now be looping through the 2 dimensional vector which we created above
	//In this case we have two iterators one for the outer loop (row) and one for the inner loop (column)
	std::clog << "Looping through vector and writing to spread sheet" << std::endl;
	for (int fOut = 0; fOut < wholeWorksheet.size(); fOut++)
	{
		std::clog << "Row" << fOut << std::endl;
		for (int fIn = 0; fIn < wholeWorksheet.at(fOut).size(); fIn++)
		{
			//Take notice of the difference between accessing the vector and accessing the work sheet
		//As you may already know Excel spread sheets start at row 1 and column 1 (not row 0 and column 0 like you would expect from a C++ vector) 
		//In short the xlnt cell reference starts at column 1 row 1 (hence the + 1s below) and the vector reference starts at row 0 and column 0
			wsOut.cell(xlnt::cell_reference(fIn + 1, fOut + 1)).value(wholeWorksheet.at(fOut).at(fIn));
			//Further clarification to avoid confusion
			//Cell reference arguments are (column number, row number); e.g. cell_reference(fIn + 1, fOut + 1)
			//Vector arguments are (row number, column number); e.g. wholeWorksheet.at(fOut).at(fIn)
		}
	}
	std::clog << "Finished writing spread sheet" << std::endl;
	wbOut.save(dest_filename);
	return 0;

}



4. 生成 --> 編譯 或者直接點選 本地偵錯程式完成除錯 最後會生成

在這裡插入圖片描述

在這裡插入圖片描述

參考