天天看點

(19)uniGUI for C++ builder下如何使用FlexCel實作EXCEL表格生成和下載下傳

                                                                                    (中行雷威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的表格功能很強大,需要的兄弟姐妹可以看起安裝目錄下的官方文檔和案例。

繼續閱讀