(中行雷威2018.8.12)
(同一個世界,同一個夢想,交流學習C++Builder XE10,傳承c++builder的魅力!歡迎各地朋友加入我的QQ群484979943、860634510、299497712,進群密碼“BCB”,同時也請将該群号廣為宣傳,希望能夠廣集各方高手,共同進步。如需下載下傳開發工具及源代碼請加入我的QQ群。)
【閱讀倡議】
1、有問題請留言;
2、沒問題請點贊;
3、看連載請加群;
4、下源碼請加群;
【開發工具】
1、C++Builder10.2.3tokyo
2、FMSoft_uniGUI_Complete_Professional_1.10.0build1472(正版)
3、TMS FlexCel for VCL & FMX 6.21.0.0 XE10.2(破解版,下載下傳https://download.csdn.net/download/dlboy2018/10598597,或到我的QQ群裡的B10目錄下載下傳)
本人主筆的國内第一本uniGUI教學案例代碼已誕生,分為cbuilder和delphi兩個版本,買代碼送手冊,需要的朋友可以加入我的QQ技術交流群484979943、860634510、299497712給我(群主)留言。資料簡介:https://blog.csdn.net/dlboy2018/article/details/88923832
本例子将詳細講解如何通過FlexCel控件實作EXCEL表格的生成和下載下傳,本文講三個案例,一個是VCL下如何生成表格并打開,一個是UNIGUI下如何生成表格并下載下傳,第三個是UNIGUI下如何将UniQuery的查詢結果儲存并下載下傳到本地。本教程的源代碼請到我的QQ群共享檔案A02-源代碼裡下載下傳。
第一部分、VCL下案例
FlexCel的安裝很簡單,直接setup就可以了,我設定的安裝目錄是C:\TMSSoftware,安裝後C:\TMSSoftware\FlexCelVCLNT\Demo\cpp下是示範案例,C:\TMSSoftware\FlexCelVCLNT\Documentation目錄下是幫助檔案,Examples-》c++ -》是c版的案例和代碼。
一、建立一個VCL項目
建立一個項目,在FormMain主視窗中添加一個按鈕,放置一個SaveDialog儲存檔案控件,即可。
1、UnitMain.h檔案
//---------------------------------------------------------------------------
#ifndef UnitMainH
#define UnitMainH
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.Buttons.hpp>
#include <Vcl.Dialogs.hpp>
#include <VCL.FlexCel.Core.hpp>
#include <FlexCel.XlsAdapter.hpp>
//---------------------------------------------------------------------------
class TFormMain : public TForm
{
__published: // IDE-managed Components
TBitBtn *BitBtn1;
TSaveDialog *SaveDialog1;
void __fastcall BitBtn1Click(TObject *Sender);
void __fastcall FormCreate(TObject *Sender);
void __fastcall writeToExcel(TExcelFile *xls);//寫表格檔案
void __fastcall saveToExcel(TExcelFile *xls); //存表格檔案
private: // User declarations
public: // User declarations
__fastcall TFormMain(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TFormMain *FormMain;
//---------------------------------------------------------------------------
#endif
2、UnitMain.cpp檔案
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "UnitMain.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFormMain *FormMain;
//---------------------------------------------------------------------------
__fastcall TFormMain::TFormMain(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::BitBtn1Click(TObject *Sender)
{
TExcelFile *xls = new TXlsFile(true);
__try
{
writeToExcel(xls);//寫表格
saveToExcel(xls);//存表格
}
__finally
{
delete xls;
}
//
}
// ---------------------------------------------------------------------------
void __fastcall TFormMain::writeToExcel(TExcelFile *xls)
{
int rowCount=5,colCount=3;
xls->NewFile(1);//建立一個表格
// 寫内容
for(int i=1;i<=rowCount;i++)
for(int j=1;j<colCount;j++)
{
xls->SetCellValue(i, j, TCellValue::Create((double)i*j));
}
xls->PrintLandscape = true;
}
//-----------------------------------------------------------------------------
void __fastcall TFormMain::saveToExcel(TExcelFile *xls)
{
if (!SaveDialog1->Execute())
return;
xls->Save(SaveDialog1->FileName);//儲存表格
if (MessageDlg("打開生成的表格檔案看看不?", mtConfirmation,
TMsgDlgButtons() << mbYes << mbNo, 0) == mrYes)
{
ShellExecute(0, L"open", SaveDialog1->FileName.c_str(), NULL, NULL,SW_SHOWNORMAL);
}
}
//-----------------------------------------------------------------------------
void __fastcall TFormMain::FormCreate(TObject *Sender)
{
SaveDialog1->DefaultExt="xlsx";
SaveDialog1->Filter="表格檔案(*.xlsx)|*.xlsx|表格檔案(*.xls)|*.xls|所有檔案(*.*)|*.*" ;
}
//---------------------------------------------------------------------------
第二部分、UNIGUI下案例
一、建立一個UniGui項目
隻需要放置一個UniBitBtn按鈕即可
1、Main.h檔案
//---------------------------------------------------------------------------
#ifndef MainH
#define MainH
#include "uniBitBtn.hpp"
#include "uniButton.hpp"
#include "uniGUIBaseClasses.hpp"
#include "uniGUIClasses.hpp"
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
#include <VCL.FlexCel.Core.hpp>
#include <FlexCel.XlsAdapter.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <uniGUIForm.hpp>
#include <uniGUIRegClasses.hpp>
#include "uniBitBtn.hpp"
#include "uniButton.hpp"
#include "uniGUIBaseClasses.hpp"
#include "uniGUIClasses.hpp"
//---------------------------------------------------------------------------
class TMainForm : public TUniForm
{
__published: // IDE-managed Components
TUniBitBtn *UniBitBtn1;
void __fastcall writeToExcel(TExcelFile *xls);//寫表格
void __fastcall saveToExcel(TExcelFile *xls); //存表格
void __fastcall UniBitBtn1Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TMainForm(TComponent* Owner);
};
//---------------------------------------------------------------------------
TMainForm *MainForm(void);
//---------------------------------------------------------------------------
#endif
2、Main.cpp檔案
//---------------------------------------------------------------------------
#include <vcl.h>
#include <uniGUIVars.hpp>
#pragma hdrstop
#include "Main.h"
#include "MainModule.h"
#include "ServerModule.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "uniBitBtn"
#pragma link "uniButton"
#pragma link "uniGUIBaseClasses"
#pragma link "uniGUIClasses"
#pragma link "uniBitBtn"
#pragma link "uniButton"
#pragma link "uniGUIBaseClasses"
#pragma link "uniGUIClasses"
#pragma resource "*.dfm"
//---------------------------------------------------------------------------
TMainForm *MainForm(void)
{
return( (TMainForm *)UniMainModule()->GetFormInstance(__classid(TMainForm)));
}
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TUniForm(Owner)
{
}
//---------------------------------------------------------------------------
void TE39ED013A2244DC798ABA9F61211176E__RegisterFormClass() {
Uniguivars::RegisterAppFormClass(__classid(TMainForm));
Uniguiregclasses::CPPInit();
}
#pragma startup TE39ED013A2244DC798ABA9F61211176E__RegisterFormClass
void __fastcall TMainForm::UniBitBtn1Click(TObject *Sender)
{
TExcelFile *xls = new TXlsFile(true);
__try
{
writeToExcel(xls);//寫表格
saveToExcel(xls);//存表格
}
__finally
{
delete xls;
}
//
}
//---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
void __fastcall TMainForm::writeToExcel(TExcelFile *xls)
{
int rowCount=5,colCount=3;
xls->NewFile(1);//建立一個表格
// Set some cell values.
for(int i=1;i<=rowCount;i++)
for(int j=1;j<colCount;j++)
{
xls->SetCellValue(i, j, TCellValue::Create((double)i*j));//寫表格内容
}
xls->PrintLandscape = true;
}
//-----------------------------------------------------------------------------
void __fastcall TMainForm::saveToExcel(TExcelFile *xls)
{
AnsiString destPath,destFile,tempFile;
tempFile="測試表格.xlsx";
destPath=UniServerModule()->FilesFolder+"我的表格\\臨時檔案";//需要在開頭#include "ServerModule.h"
//強制在服務端生成臨時檔案儲存目錄
if(!DirectoryExists(destPath))
{
ForceDirectories(destPath.c_str());
}
destFile=destPath+"\\"+tempFile;
//儲存表格到伺服器端的臨時目錄
xls->Save(destFile);
//浏覽器端發起下載下傳表格
UniSession->SendFile(destFile);
}
//-----------------------------------------------------------------------------
第三部分、UNIGUI下将UniQuery結果儲存成表格并下載下傳
本例子中我的視窗名字叫UniformFreeQuery,本視窗是一個複雜的查詢視窗,後續代碼僅講解如何将一個UniQuery的結果集儲存到表格裡面,視窗必須的是一個UniQuery控件,一個SaveDialog控件。
1、UnitFreeQuery.h代碼
//---------------------------------------------------------------------------
#ifndef UnitFreeQueryH
#define UnitFreeQueryH
#include "DADump.hpp"
#include "DBAccess.hpp"
#include "MemDS.hpp"
#include "Uni.hpp"
#include "uniBasicGrid.hpp"
#include "uniBitBtn.hpp"
#include "uniButton.hpp"
#include "uniComboBox.hpp"
#include "uniDBGrid.hpp"
#include "UniDump.hpp"
#include "uniGUIBaseClasses.hpp"
#include "uniGUIClasses.hpp"
#include "uniLabel.hpp"
#include "uniListBox.hpp"
#include "uniMemo.hpp"
#include "uniMultiItem.hpp"
#include "uniPageControl.hpp"
#include "uniPanel.hpp"
#include "uniSplitter.hpp"
#include <Data.DB.hpp>
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.Dialogs.hpp>
#include <VCL.FlexCel.Core.hpp>
#include <FlexCel.XlsAdapter.hpp>
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <uniGUIForm.hpp>
#include "uniBasicGrid.hpp"
#include "uniBitBtn.hpp"
#include "uniButton.hpp"
#include "uniComboBox.hpp"
#include "uniDBGrid.hpp"
#include "uniGUIBaseClasses.hpp"
#include "uniGUIClasses.hpp"
#include "uniLabel.hpp"
#include "uniListBox.hpp"
#include "uniMemo.hpp"
#include "uniMultiItem.hpp"
#include "uniPageControl.hpp"
#include "uniPanel.hpp"
#include "DBAccess.hpp"
#include "MemDS.hpp"
#include "Uni.hpp"
#include <Data.DB.hpp>
#include "uniSplitter.hpp"
#include "DADump.hpp"
#include "UniDump.hpp"
//---------------------------------------------------------------------------
class TUniFormFreeQuery : public TUniForm
{
__published: // IDE-managed Components
TUniPageControl *UniPageControl1;
TUniTabSheet *UniTabSheet1;
TUniBitBtn *UniBitBtn4;
TUniBitBtn *UniBitBtn6;
TUniButton *UniButton1;
TUniBitBtn *UniBitBtn7;
TUniBitBtn *UniBitBtn8;
TUniQuery *UniQuery1;
TUniQuery *UniQuery2;
TUniQuery *UniQuery3;
TUniDataSource *UniDataSource1;
TUniContainerPanel *UniContainerPanel7;
TUniComboBox *UniComboBox3;
TUniLabel *UniLabel3;
TUniLabel *UniLabel2;
TUniLabel *UniLabel1;
TUniComboBox *UniComboBox1;
TUniComboBox *UniComboBox2;
TUniBitBtn *UniBitBtn1;
TUniBitBtn *UniBitBtn2;
TUniBitBtn *UniBitBtn3;
TUniContainerPanel *UniContainerPanel8;
TUniContainerPanel *UniContainerPanel9;
TUniListBox *UniListBox1;
TUniListBox *UniListBox2;
TUniPageControl *UniPageControl2;
TUniTabSheet *UniTabSheet2;
TUniContainerPanel *UniContainerPanel1;
TUniDBGrid *UniDBGrid1;
TUniContainerPanel *UniContainerPanel2;
TUniMemo *UniMemo1;
TUniContainerPanel *UniContainerPanel4;
TUniBitBtn *UniBitBtn9;
TUniBitBtn *UniBitBtn10;
TUniBitBtn *UniBitBtn11;
TUniBitBtn *UniBitBtn5;
TUniMemo *UniMemo2;
TUniLabel *UniLabel4;
TUniLabel *UniLabel5;
TUniBitBtn *UniBitBtn12;
TUniSplitter *UniSplitter1;
TSaveDialog *SaveDialog1;
void __fastcall UniFormBeforeShow(TObject *Sender);
void __fastcall UniComboBox1Select(TObject *Sender);
void __fastcall UniComboBox2Select(TObject *Sender);
void __fastcall UniComboBox3Select(TObject *Sender);
void __fastcall UniBitBtn4Click(TObject *Sender);
void __fastcall UniBitBtn5Click(TObject *Sender);
void __fastcall UniBitBtn11Click(TObject *Sender);
void __fastcall UniBitBtn8Click(TObject *Sender);
void __fastcall UniBitBtn7Click(TObject *Sender);
void __fastcall UniBitBtn6Click(TObject *Sender);
void __fastcall UniButton1Click(TObject *Sender);
void __fastcall UniBitBtn1Click(TObject *Sender);
void __fastcall UniBitBtn2Click(TObject *Sender);
void __fastcall UniBitBtn3Click(TObject *Sender);
void __fastcall UniBitBtn9Click(TObject *Sender);
void __fastcall UniBitBtn12Click(TObject *Sender);
void __fastcall saveToExcel(TExcelFile *xls); //存表格
void __fastcall UniBitBtn10Click(TObject *Sender);
void __fastcall UniFormCreate(TObject *Sender);
private: // User declarations
String mySql,rowId,tmpStr,tmpStr1,tmpStr2;
public: // User declarations
__fastcall TUniFormFreeQuery(TComponent* Owner);
};
//---------------------------------------------------------------------------
#endif
2、UniFreeQuery.cpp代碼
void __fastcall TUniFormFreeQuery::UniBitBtn10Click(TObject *Sender)
{
TExcelFile *xls = new TXlsFile(true);
__try
{
saveToExcel(xls);
}
__finally
{
delete xls;
}
}
//---------------------------------------------------------------------------
void __fastcall TUniFormFreeQuery::saveToExcel(TExcelFile *xls)
{
AnsiString destPath,destFile,tempFile;
int rowCount,colCount,i,j;
if(!UniQuery1->Active)
{
ShowMessage("先查詢,再導出!");
return;
}
if(UniQuery1->RecordCount<1)
{
ShowMessage("沒有記錄,取消導出!");
return;
}
//
xls->NewFile(1);
rowCount=UniQuery1->RecordCount;
colCount=UniQuery1->FieldCount;
//寫列頭
i=1;
for(j=1;j<colCount;j++)
{
xls->SetCellValue(i, j, TCellValue::Create(UniQuery1->Fields->FieldByNumber(j)->FieldName));
}
//寫資料
i=2;
while(!UniQuery1->Eof)
{
for(j=1;j<colCount;j++)
{
xls->SetCellValue(i, j, TCellValue::Create(UniQuery1->Fields->FieldByNumber(j)->AsString));
}
UniQuery1->Next();
i++;
}
xls->PrintLandscape = true;
tempFile="定制導出.xlsx";
destPath=UniServerModule()->FilesFolder+"臨時檔案\\下載下傳表格";
//強制在服務端生成臨時檔案儲存目錄
if(!DirectoryExists(destPath))
{
ForceDirectories(destPath.c_str());
}
destFile=destPath+"\\"+tempFile;
//儲存表格到伺服器端的臨時目錄
xls->Save(destFile);
//選擇本地儲存目錄和檔案名
if(!SaveDialog1->Execute() )
return;
//浏覽器端将伺服器端預設臨時表格檔案下載下傳儲存成本地新名字
UniSession->SendFile(destFile,SaveDialog1->FileName);
}
//-----------------------------------------------------------------------------
void __fastcall TUniFormFreeQuery::UniFormCreate(TObject *Sender)
{
SaveDialog1->DefaultExt="xlsx";
SaveDialog1->Filter="表格檔案(*.xlsx)|*.xlsx|表格檔案(*.xls)|*.xls|所有檔案(*.*)|*.*" ;
}
//---------------------------------------------------------------------------
FlexCel的表格功能很強大,需要的兄弟姐妹可以看起安裝目錄下的官方文檔和案例。