久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7178|回復: 1
收起左側

在C++ Builder 10 Seattle 中讀寫XLS文件的源代碼實例!

[復制鏈接]
ID:113276 發表于 2016-4-10 17:58 | 顯示全部樓層 |閱讀模式
前言
貌似簡單的XLS文件操作不簡單,也只有專業的軟件公司例如金山WPS,永中Office等能夠做到,其它小公司也就會編寫病毒流氓軟件和殺毒軟件,正兒八經的軟件一個也不會。15億人口也做不出來一個操作系統,幾百所高校也誕生不了一個類似德州儀器的公司!

也就是一個老頭子倪光南在天天呼吁發展國產系統、國產軟件,也上升不了國家意志,估計這個老頭再呼吁20年,國內IT行業的硬件和軟件還是一如既往的和美國等的差距越拉越大,慘不忍睹。

因為國家不重視軟件技術,從來沒有幾個像樣的工業基礎軟件,只有消費類的app,流氓軟件,病毒和殺毒軟件。十億人民九億賭,還有一億在跳舞,大街小巷斗地主,年輕的、有錢的,只會網游、炒房和炒股!


正文
在C++ Builder 10 Seattle 中使用XLSReadWriteII5控件讀寫XLS文件的源代碼實例!

XLSReadWrite控件并不是C++ Builder/Delphi編譯器自帶的,是第三方的控件,其控件源代碼經過10多年的發展,*.pas文件
有100多個,函數上千個,delphi源代碼是收費,對delphi支持最好。該控件在網上能下載到多個版本,例如2.x、4.x、5.x,
一般只帶有delphi的安裝包,不含有C++ Builder的安裝包。

XLSReadWrite控件最新的5.x版本,直接支持Delphi 10 Seattle,功能非常復雜和龐大,支持xls、xlsx文件讀寫,幾乎所有基于
微軟OLE技術對Excel表格文件的操作,這個控件都包含了,常用功能有Excel文件讀寫,指定單元格讀寫、各種對象的插入、
刪除、移動、復制等等。XLSReadWriteII v5.20.47 版本控件源代碼有87萬行,最早版本是1998年出現的,總共修改、更新了
十多年,也只有老外,才會十幾年一如既往的專注一個控件,國內的公司都是急功近利,不修內功,只走捷徑。

不付費時,可以下載該控件的dcu、obj文件,將控件安裝到delphi 10 Seattle環境中。如果要安裝到C++ Builder 10 Seattle中,
必須有pas源代碼,并新建安裝包工程。

在Delphi/C++ Builder中通過XLSReadWrite控件來操作Excel簡便快捷,可在本機未安裝微軟Office的情況下讀取和寫入Excel文件。

以下代碼是根據官方例程修改而成,通過了調試!
沒有使用專門的報表控件,使用顯示自繪的StringGrid顯示表格內容,用于復雜的參數配置xls文件的讀寫。

// ---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
// ---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include "XLSReadWriteII5.hpp"
#include "XLSSheetData5.hpp"
#include <Vcl.Grids.hpp>
#include <Vcl.ComCtrls.hpp>
#include <Vcl.Dialogs.hpp>
#include <Vcl.ExtCtrls.hpp>

// ---------------------------------------------------------------------------
class TForm1 : public TForm {
__published: // IDE-managed Components

    TPanel *Panel1;
    TPanel *Panel2;
    TStatusBar *StatusBar1;
    TPageControl *PageControl1;
    TTabSheet *TabSheet1;
    TTabSheet *TabSheet2;
    TTabSheet *TabSheet3;
    TTabSheet *TabSheet4;
    TTabSheet *TabSheet5;
    TTabSheet *TabSheet6;
    TDrawGrid *Grid;
    TButton *Button1;
    TButton *Button2;
    TEdit *edFilename;
    TEdit *edCell;
    TLabel *Label1;
    TLabel *lblCell;
    TOpenDialog *dlgOpen;
    TXLSReadWriteII5 *XLS;

    void __fastcall FormCreate(TObject *Sender);
    void __fastcall Button1Click(TObject *Sender);
    void __fastcall Button2Click(TObject *Sender);
    void __fastcall GridSelectCell(TObject *Sender, int ACol, int ARow,
        bool &CanSelect);
    void __fastcall GridDrawCell(TObject *Sender, int ACol, int ARow,
        TRect &Rect, TGridDrawState State);
    void __fastcall GridGetEditText(TObject *Sender, int ACol, int ARow,
        UnicodeString &Value);
    void __fastcall GridKeyDown(TObject *Sender, WORD &Key, TShiftState Shift);
    void __fastcall GridSetEditText(TObject *Sender, int ACol, int ARow,
        const UnicodeString Value);

private: // User declarations

    int EditCol, EditRow;
    AnsiString EditText;

    AnsiString __fastcall ColToText(int Col);
    void __fastcall SetCellValue(int Col, int Row);

public: // User declarations
    __fastcall TForm1(TComponent* Owner);
};

// ---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
// ---------------------------------------------------------------------------
#endif


// ---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
// ---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "XLSReadWriteII5"
#pragma link "XLSSheetData5"
#pragma resource "*.dfm"

/*
#pragma link “[path]modulename[.ext]”
該指令命令連接器將一個文件連接到可執行文件中。缺省情況下,連接器缺省在本地路徑下
查找modulename文件。

#pragma resource "*.dfm" 表示把*.dfm文件中的資源加入工程。*.dfm中包括窗體外觀的
定義。
*/

TForm1 *Form1;

// ---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {
}
// ---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender) {
    dlgOpen->FileName = edFilename->Text;
    if (dlgOpen->Execute())
        edFilename->Text = dlgOpen->FileName;

}
// ---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender) {
    XLS->Filename = edFilename->Text;
    XLS->Read();

    /*
     TabSet->Tabs->Clear();
     for (i = 0; i < XLS->Sheets->Count; i++)
     TabSet->Tabs->Add(XLS->Sheets->Items[0]->Name);
     TabSet->TabIndex = 0;
     */
    Grid->Invalidate();
}
// ---------------------------------------------------------------------------

void __fastcall TForm1::GridSelectCell(TObject *Sender, int ACol, int ARow,
    bool &CanSelect) {
    lblCell->Caption = ColRowToRefStr(ARow - 1, ACol - 1, False, False);

    switch (XLS->Sheets[0]->CellType[ACol - 1][ARow - 1]) {
#if 0
    case ctNumberFormula:
    case ctStringFormula:
    case ctBooleanFormula:
        edCell->Text = "=" + XLS->Sheets->Items[0]->AsFormula[ACol - 1]
            [ARow - 1];
        break;
    case ctFloat:
        edCell->Text =
            FloatToStr(XLS->Sheets->Items[0]->AsFloat[ACol - 1][ARow - 1]);
        break;
    case ctInteger:
        edCell->Text =
            IntToStr(XLS->Sheets->Items[0]->AsInteger[ACol - 1][ARow - 1]);
        break;
    case ctString:
        edCell->Text = XLS->Sheets->Items[0]->AsWideString[ACol - 1][ARow - 1];
#endif
    case 0:
        break;
    default:
        edCell->Text = XLS->Sheets[0]->AsString[ACol - 1][ARow - 1];
    }

    if ((EditCol == Grid->Col) && (EditRow == Grid->Row))
        SetCellValue(Grid->Col - 1, Grid->Row - 1);
}

// ---------------------------------------------------------------------------

void __fastcall TForm1::SetCellValue(int Col, int Row) {

    if (EditText.SubString(1, 1) == "=")
        XLS->Sheets[0]->AsFormula[Col][Row] = EditText.SubString(2, 0xFFFF);
    else {
        try {
            XLS->Sheets[0]->AsFloat[Col][Row] = StrToFloat(EditText);
        }
        catch (...) {
            XLS->Sheets[0]->AsString[Col][Row] = EditText;
        }
    }

}
// ---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender) {
    EditCol = 0;
    EditRow = 0;
}

// ---------------------------------------------------------------------------
AnsiString __fastcall TForm1::ColToText(int Col) {
    AnsiString S;

    if ((Col / 26) > 0)
        S = 'A' + (Col / 26);
    else
        S = "";

    S = S + 'A' + ((Col + 1) % 26);
    return S;
}
// ---------------------------------------------------------------------------

void __fastcall TForm1::GridDrawCell(TObject *Sender, int ACol, int ARow,
    TRect &Rect, TGridDrawState State) {
    AnsiString S;

    if ((ACol > 0) && (ARow > 0)) {
        S = XLS->Sheets[0]->AsFmtString[ACol - 1][ARow - 1];
        if (S != "")
            Grid->Canvas->TextRect(Rect, Rect.Left + 2, Rect.Top + 2, S);
    }
    else if (ACol != 0) {
        S = ColToText(ACol - 1);
        Grid->Canvas->TextRect(Rect, Rect.Left + (Rect.Right - Rect.Left) / 2 -
            (Grid->Canvas->TextWidth(S) / 2), Rect.Top + 2, S);
    }
    else if (ARow != 0)
        Grid->Canvas->TextRect(Rect, Rect.Left + 2, Rect.Top + 2,
        IntToStr(ARow));
}

// ---------------------------------------------------------------------------
void __fastcall TForm1::GridGetEditText(TObject *Sender, int ACol, int ARow,
    UnicodeString &Value)

{
    EditCol = ACol;
    EditRow = ARow;
    switch (XLS->Sheets[0]->CellType[ACol - 1][ARow - 1]) {
#if 0
    case ctNumberFormula:
    case ctStringFormula:
    case ctBooleanFormula:
        Value = "=" + XLS->Sheets->Items[0]->AsFormula[ACol - 1][ARow - 1];
        break;
    case ctFloat:
        Value = FloatToStr(XLS->Sheets->Items[0]->AsFloat[ACol - 1][ARow - 1]);
        break;
    case ctInteger:
        Value = IntToStr(XLS->Sheets->Items[0]->AsInteger[ACol - 1][ARow - 1]);
        break;
    case ctString:
        Value = XLS->Sheets->Items[0]->AsWideString[ACol - 1][ARow - 1];
#endif
    case 0:
    default:
        Value = XLS->Sheets[0]->AsString[ACol - 1][ARow - 1];
    }
}
// ---------------------------------------------------------------------------

void __fastcall TForm1::GridKeyDown(TObject *Sender, WORD &Key,
    TShiftState Shift)

{
    if ((Key == VK_RETURN) && (EditCol == Grid->Col) && (EditRow == Grid->Row))
        SetCellValue(Grid->Col - 1, Grid->Row - 1);
}
// ---------------------------------------------------------------------------

void __fastcall TForm1::GridSetEditText(TObject *Sender, int ACol, int ARow,
    const UnicodeString Value)

{
    EditText = Trim(Value);
}
// ---------------------------------------------------------------------------



參考文章:
http://www.cnblogs.com/dabiao/archive/2011/07/08/2100609.html
http://www.cnblogs.com/dabiao/archive/2011/07/08/2100613.html

delpihi編程時注意Excel單元格的幾種類型

CellType 有以下幾種定義
xctNone
xctBlank
xctBoolean
xctError
xctString
xctFloat
xctFloatFormula
xctStringFormula
xctBooleanFormula
xctErrorFormula

對于xctNone類型,讀取時一般做如下處理
  C,R: integer;
  Col_Count,Row_Count: integer;
  Ref: string;
  Cnt: integer;
  vError: TXc12CellError;
  CellType: TXLSCellType;
  XLS[0].CalcDimensions; // 計算sheet0總行數和總列數
  Col_Count := XLS[0].LastRow - XLS[0].FirstRow;
  Row_Count := XLS[0].LastCol - XLS[0].FirstCol;
  Ref := ColRowToRefStr(C,R);

然后根據具體類型分別處理,其中字符串類型單元格處理如下:
  Grid.Cells[2,Cnt + 1] := XLS[0].AsString[C,R];

浮點數類型單元格處理如下:
  Grid.Cells[2,Cnt + 1] := FloatToStr(XLS[0].AsFloat[C,R]);


http://wenku.baidu.com/link?url= ... m9wGsvbi_mhAMmEqedy

C/C++ 編譯器歷史
C/C++ 編譯器歷史

Borland C/C++編譯器介紹

Borland Turbo C 1.0 (1987, MSDOS)  文本編輯、程序編譯、連接、運行一體化。

Borland Turbo C 1.5 (1988, MSDOS)  增加圖形庫文本窗口函數庫。

Borland Turbo C 2.0 (1989, MSDOS)  查錯功能,可生成.COM文件(Tiny模式),(8087/80287/80387等)數字協處理器仿真支持。

Borland C++ 2.0 - (1990, MSDOS)

Borland C++ 3.0 - (1991) New compiler support to build Microsoft Windows applications.

Borland C++ 3.1 - (1992) Introduction of Windows-based IDE and application frameworks (OWL 1.0, Turbovision 1.0)

Borland C++ 4.0 - (1993, Windows 3.x) MS-DOS IDE supported no longer included, OWL 2.0.

Borland C++ 2.0 - (1992, OS/2)

Borland C++ 4.01

Borland C++ 4.02 - (1994)

Borland C++ 4.5

Borland C++ 4.51

Borland C++ 4.52 - (1995) 支持 Windows 95, OWL 2.5

Borland C++ 4.53

Borland C++ 5.0 - (1996, Windows 95) Released in March 1996. Works on Windows 95 and Windows NT 3.51.
It does not (officially) work on Windows NT 4.0 (which was still in development at that time).
3rd party tests exhibited some problems on NT 4.0. It does not work in Windows 3.x or DOS. Despite that,
it can produce either Win32, Win16 or DOS programs.

Borland C++ 5.01

Borland C++ 5.02 - (1997) Final release of the Borland C++ IDE (subsequently replaced up by the C++ Builder
series), final release to support compilation to (real-mode) MS-DOS target. Windows NT 4.0 officially
supported.

Borland C++ 5.5 - Command-line compiler only (not with IDE). It is still (freely) available from Borland.

Borland C++ Builder 6.0

CodeGear Delphi 2006 / C++Builder 2006 CodeGear是Borland 的全資子公司。

CodeGear Delphi/C++Builder 2007 for Win32

Embarcadero Delphi 2009 / C++Builder 2009 (Win32) 最后一個非Unidoce的編譯器版本,2008年5月7日Borland以2300萬美元賣掉CodeGear。

Embarcadero Delphi 2010 / C++Builder 2010 (Win32)

Embarcadero Delphi XE / C++Builder XE (Win32)   

Embarcadero Delphi XE2 / C++Builder XE2

Embarcadero Delphi XE3 / C++Builder XE3

Embarcadero Delphi XE4 / C++Builder XE4

Embarcadero Delphi XE5 / C++Builder XE5

Embarcadero Delphi XE6 / C++Builder XE6 (Win32/Win64/OSX/iOS/Android) 跨平臺支持,集成ARM-GCC編譯器。

Embarcadero Delphi XE7 / C++Builder XE7 (Win32/Win64/OSX/iOS32/iOS64/Android) 跨平臺支持。

Embarcadero Delphi Seattle / C++Builder Seattle 2015年10月7日,IDERA收購Embarcadero。據說有中文支持及Linux平臺研發計劃。


微軟C/C++編譯器介紹

Microsoft Visual C++ 1.0 (1992, Windows 3.0) 集成MFC2.0, 是Microsoft C/C++ 7.0的升級版本。

Microsoft Visual C++ 1.5 集成MFC2.5, 增加OLE技術和 ODBC支持,是最后一個支持16位軟件編程的軟件,也是第一個支持基于x86機器的32位編程軟件。

Microsoft Visual C++ 2.0 (1994, Windows 3.x)集成MFC3.0, 第一個只發行32位的版本。Visual C++ 2.x附帶了16位和32位版本的CDK,同時支持Win32s的開發。

Microsoft Visual C++ 4.0 (1995, Windows 95) 集成MFC4.0, 升級至4.1和4.2版本, 這個版本是專門為Windows 95以及Windows NT設計的。

Microsoft Visual C++ 5.0 (1995, Windows 95) 集成了MFC4.21,是4.2版以來比較大的一次升級。

Microsoft Visual C++ 6.0 (1995, Windows 98) 集成了MFC6.0,適用于Windows 98、Windows NT4.0、或Windows 2000。

Microsoft Visual C++ .NET 2002(Visual C++ 7.0) 2002年發行,集成了MFC7.0,支持原生64位軟件的開發。

Microsoft Visual C++ .NET 2003(Visual C++ 7.1) 2003年發行,集成了MFC 7.1。

Microsoft eMbedded Visual C++ 用于Windows CE操作系統,Visual C++作為一個獨立的開發環境被Microsoft Visual Studio 2005所替代。

Microsoft Visual C++ 2005 (Visual C++ 8.0) 2005年11月發布,集成了MFC 8.0,引進了對C++/CLI語言和OpenMP的支持。

Microsoft Visual C++ 2008 (Visual C++ 9.0) 2007年11月發布,支持.NET 3.5,放棄了Win9x架構支持,是目前最穩定版本。

Microsoft Visual C++ 2010 (Visual C++ 10.0) 2009年發布,新添加了對C++11標準引入的幾個新特性的支持。

Microsoft Visual C++ 2012 (Visual C++ 11.0) 2012年5月26日發布,支持.net4.5 beta,并實現go live。僅支持win7以上系統。

Microsoft Visual Studio 2013

Microsoft Visual Studio 2015


Intel C++ Compilers

Intel C++ Compiler in Intel Parallel Studio XE

C++/Fortran performance suite for technical computing, enterprise and HPC on Windows*, Linux* and OS X*.

Intel C++ Compiler in Intel System Studio

Embedded and mobile device C++ suite on Windows, Android* and Linux


GNU Compiler Collection

GCC(GNU Compiler Collection,GNU編譯器套裝),是一套由 GNU 開發的編程語言編譯器。
它是一套以 GPL 及 LGPL 許可證所發行的自由軟件,也是 GNU計劃 的關鍵部分,亦是自由的
類Unix 及蘋果計算機 Mac OS X 操作系統的標準編譯器。GCC(特別是其中的C語言編譯器)
也常被認為是跨平臺編譯器的事實標準。


本文中涉及到的編譯器,是廣義的編譯器,包含集成化的開發環境(IDE),是開發應用軟件的基礎軟件。

題外話:  大家可以看到了,在信息技術領域,無論是硬件方面的芯片技術,還是基礎軟件、應用軟件方面,
國外都在加速發展,越來越快。國內則是一如既往的盜版、破解橫行。區區一個Windows95系統,微軟
幾千人耗時三年才研發出來,國內那些百人的小公司,能做出什么玩意兒?

回復

使用道具 舉報

ID:506615 發表于 2019-4-7 23:40 | 顯示全部樓層
太亂了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久天天躁狠狠躁夜夜躁2014 | 欧美一区二区三区在线观看视频 | 91精品国产高清一区二区三区 | 国产精品美女久久久久久免费 | 亚洲色图网址 | 91视频在线 | 一级片免费视频 | 欧美日一区二区 | 欧美乱大交xxxxx另类电影 | 欧美日韩精品影院 | 国产精品一区二区三区四区 | 欧洲亚洲一区二区三区 | 亚洲精品电影在线观看 | 狠狠操狠狠搞 | 激情五月激情综合网 | 久久综合久| 日韩免费福利视频 | 久久1区 | 久久久美女 | 亚洲精品视频免费 | 国产在线精品一区 | 黑人中文字幕一区二区三区 | 欧美性另类 | 欧州一区二区三区 | 国产精品成人一区二区三区 | 男女激情网站免费 | 国产在线第一页 | 超碰在线免费 | 青青草久久 | 亚洲免费在线观看 | 国产精品区二区三区日本 | 日韩视频中文字幕 | 午夜专区| 色狠狠一区 | 亚洲欧美成人影院 | 天天躁日日躁狠狠的躁天龙影院 | 午夜影院网站 | 成人在线视频网址 | 久久国产亚洲 | 成人在线免费观看 | 亚洲精品视频在线播放 |