前言
貌似简单的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系统,微软
几千人耗时三年才研发出来,国内那些百人的小公司,能做出什么玩意儿?
|