需要讀取EXCEL , 問哪種方式好。

勉励前行 2010-11-19 12:02:02
現在需要從EXCEL文件中提取數據,放入數據庫中。

EXCEL文件不是很規范,屬於相對自由的格式,裡面放的是產品的工藝規范,現想從裡面提取數據。讀入時需要做很多判斷。

因為有很多文件要處理(接近萬個),ADO方式是不行的了。因為格式復雜。同時又覺得OLE方式慢,占用資源大。

只需要讀EXCEL, 不需要寫。

...全文
399 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
勉励前行 2010-12-06
  • 打赏
  • 举报
回复
今天在WIN2003上测试过了,可以用。
//上面读Shape的代码,不能读出Group中的Shape, 需要改一下,

//递归读取Group中的Shape...
void ReadShapeGroup(TShapeGroupClientAnchor *pGroupClient)
{
int Count = pGroupClient->Count() ;
for(int i = 0 ; i < Count ; ++i)
{
TShapeGroupClientAnchor *GroupChild =
dynamic_cast<TShapeGroupClientAnchor*>(pGroupClient->Items[i]);
TShapeChildAnchor *pShapeChild =
dynamic_cast<TShapeChildAnchor*>(pGroupClient->Items[i]);
if(GroupChild) //子Group
ReadShapeGroup(GroupChild);
else if(pShapeChild) //可识别的Shape
{
pShapeChild->ShapeType ; //Shape类型太多,要自行测试。箭头 = 20
pShapeChild->FlipHorizontal ;//水平翻转
pShapeChild->FlipVertical ; //竖直翻转 这两个翻转值可以用来识别箭头的方向。
pShapeChild->X1 ; // X1 Y1 X2 Y2 是其矩形坐标
//读出每行高,及每列宽,通过计算得到 Shape 是在哪行哪列。
//再通过识别合并单元格,得到箭头指向的内容。
}
else //未能识别的 Shape
{
pGroupClient->Items[i]->ShapeType ;
//...
}
}
}

//使用代码:
XLS->Filename = OpenDialog1->FileName ;
XLS->RefreshAll = true ;
XLS->Read();
TShapeGroupClientAnchor*group = dynamic_cast<TShapeGroupClientAnchor*>
(XLS->Sheets->Items[0]->_Int_EscherDrawing->Group);
if(group)
ReadShapeGroup(group);


暂时使用这控件来做,速度还挺快,但测试时,如果调试器读取了意外的单元(下标越界或野指针),会导致IDE死掉。用其他方式,我还不知道该怎样实现这个过程。

周药师 2010-12-06
  • 打赏
  • 举报
回复
听说这个控件在CB2010下 修改了、 保存excel后
这个excel 变成加密的 只读文件了?
ccrun.com 2010-12-05
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 ppower 的回复:]
據介紹說可以,我沒真正測試。我想應該是真的可以。 
[/Quote]

我以为你测试过了。搞一个虚拟机试试呗。
勉励前行 2010-12-04
  • 打赏
  • 举报
回复
邏輯復雜,因為合並單元格太多。要分析合並單元格才能得到結果。
勉励前行 2010-11-26
  • 打赏
  • 举报
回复
據介紹說可以,我沒真正測試。我想應該是真的可以。 
bigfog 2010-11-26
  • 打赏
  • 举报
回复
我想问一下,XLSReadWriteII这个控件是否能在没有安装excel的电脑上运行
bluesen 2010-11-26
  • 打赏
  • 举报
回复
还不如另存为文本文件格式,再写程序来处理就方便了,文本文件用用BCP也好处理
勉励前行 2010-11-25
  • 打赏
  • 举报
回复
BCB是要改 .OBJ .LIB ,直接改 BPL 也行。不過可能要改的地方是一樣的吧。
最好是改 lib ,這樣: #pragma link "XLSReadWriteII.lib" 就能用,方便。

我測試用的就是從 CCRUN 下載的Crack版本。
ccrun.com 2010-11-25
  • 打赏
  • 举报
回复
XLSReadWriteII 4.00.41 - Patch it yourself
*** All versions up to Delphi XE ! ***

Install trial
Open XLSReadWriteII4.dcu with HEX-Editor in install subdir
(e.g. C:\Program Files\XLSReadWriteII 4.00.41\Package\D2011)
Search for pattern 741F6A000FB7 and Replace 74 with EB
Search 2x for pattern 7C224633DB68 and Replace 7C with EB
Search for pattern 75586A00 and Replace 75 with EB
Search for pattern 7C1F4333 and Replace 7C with EB
Save changes => No more NagScreen and no copyright text in cell A1
ccrun.com 2010-11-25
  • 打赏
  • 举报
回复
这个组件在网上只有Crack的. 包括4.0.41的都可以找到, 但是源码木有.
勉励前行 2010-11-25
  • 打赏
  • 举报
回复
未能識別出箭頭的方向,沒有箭頭的方向,美中不足啊。
幸好這些工藝流程圖不算太復雜,沒方向也該不會搞錯。接下來是寫代碼時間,從EXCEL中提取工藝鏈,提取BOM,現在還不敢說結果肯定正確。但肯定能大大減少錄入的工作量。

勉励前行 2010-11-25
  • 打赏
  • 举报
回复
今天再試XLSReadWriteII , 找到了讀出 直線,箭頭的辦法,示例代碼:
TXLSReadWriteII4 *XLS = new TXLSReadWriteII4 (this);
XLS->Filename = OpenDialog1->FileName ;
XLS->Read();
TShapeGroup *group = XLS->Sheets->Items[0]->_Int_EscherDrawing->Group ;
if(group)
for(int i = 0 ; i < group->Count ; ++i )
{
TShapeClientAnchor *pShape = dynamic_cast<TShapeClientAnchor*>(group->Items[i]);
if(pShape)
{
switch(pShape->ShapeType) //得自己識別是 圖片 圖形或是其他什麼東西。找不到幫助
{
case 20 : //直線與箭頭 
pShape->GetPos(....);//取坐標。
XLS->Sheets->Items[0]->DrawingObjects->Basics->AddFromFile(pShape);//轉換成TDrwBasic
......
}
}
}

這個控件不錯,不用裝Excel就能快速讀寫EXCEL文件,可惜只有CRACK,要付費而且也算貴。沒找到源碼。

ccrun.com 2010-11-24
  • 打赏
  • 举报
回复
今天刚把虚拟主机升了级, 以后访问ccrun.com不管什么线路, 速度都会很快. 现在已经好了.
勉励前行 2010-11-24
  • 打赏
  • 举报
回复
看了XLSReadWriteII,挺好的,速度也快,可惜沒全部源碼,對於 Shape 等對象,我找不到讀出 EXCEL直線相關屬性的方法。
我測試時,用XLSReadWriteII 寫進去的直線,都無法用XLSReadWriteII再讀出來為。圖片倒是可以讀寫.

老妖網站上的 XLSReadWriteII v4.0.21.Full.Source, 不是源碼的版本,是carck版本。只是標題上寫上 Full.Source 而已。CCRUN.com早上還能上,現在好象又連不上了。
勉励前行 2010-11-20
  • 打赏
  • 举报
回复
分析了一下文件,一些圖及表可以被忽略不理,還有個技術問題解決不了:

如何得到EXCEL中的直線起點終點在哪個單元格?
需要這個才能識別出工藝鏈。
周药师 2010-11-20
  • 打赏
  • 举报
回复
不知道XLSReadWriteII.v4.0.21.Full.Source控件是否符合楼主的要求
ccrun.com 2010-11-19
  • 打赏
  • 举报
回复
复杂的表格,恐怕只有COM方式了。
lurel 2010-11-19
  • 打赏
  • 举报
回复
呵呵,出个馊主意,Java里面有个开源的jxl,要不用jni调用一下,我就这么干过。
其他免费的库或者算法都不怎么好用。
xflidengqiang2008 2010-11-19
  • 打赏
  • 举报
回复
我也想把excel里面数据读到DBGridEh里面。?高手们给我搞个具体的例子。。。。。先谢谢了!

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧