用saveDBGridEhToExportFile匯出excel后當一個欄位的漢字數超過135個漢字。在你打開這個excel檔案時報資料丟失錯誤。打開后超過135個漢字的欄位單元內容為空。其他欄位單元正常。請教大俠們怎么解決這個問題。
uj5u.com熱心網友回復:
有哪位大俠遇到過類似問題的。uj5u.com熱心網友回復:
Excel的問題還是DBGRID的問題,更新版本試試。uj5u.com熱心網友回復:
excel應該沒問題,直接拷貝超135漢字進去是可以的uj5u.com熱心網友回復:
我也遇到這種問題,是資料庫欄位varchar型超過255個字符,匯出到Excel就會沒有內容,Eh版本是5.6的,很棘手。uj5u.com熱心網友回復:
這種問題誰有好的辦法解決?uj5u.com熱心網友回復:
借地問一下 saveDBGridEhToExportFile匯出多層表頭的excel檔案 現在能行了嗎 效果怎樣?uj5u.com熱心網友回復:
他的資料型別可能是AnsiString,可能是不能多于255個位元組uj5u.com熱心網友回復:
自已直接匯出撒。//采用BIFF8格式規范二進制流寫入XLS檔案
function sycExportDateToExcel(ASender: TDBGridEh;var TitleName:string): Boolean;
procedure XLSWriteStringCell(nRow,nCol : WORD;AValue: String);//寫字串資料
var L: Word;
var _str : AnsiString;
begin
_str:=AnsiString(AValue);//強制型別轉換,兼容Delphi2009,采用String型別要亂碼,Delphi2007以下此行代碼無所謂
L := Length(_str);//Length回傳的字符個數,采用AnsiString也就是位元組長度
arXlsString[1] := 8 + L;
arXlsString[2] := nRow;
arXlsString[3] := nCol;
arXlsString[5] := L;
aFileStream.WriteBuffer(arXlsString, SizeOf(arXlsString));
aFileStream.WriteBuffer(Pointer(_str)^, L);//位元組長度
end;
procedure XLSWriteIntegerCell(nRow,nCol : WORD;AValue: Integer);//寫整數
var V: DWORD;
begin
arXlsInteger[2] := nRow;
arXlsInteger[3] := nCol;
aFileStream.WriteBuffer(arXlsInteger, SizeOf(arXlsInteger));
V := (AValue shl 2) or 2;
aFileStream.WriteBuffer(V, 4);
end;
procedure XLSWriteFloatCell(nRow,nCol : WORD;AValue: Double);//寫浮點數
begin
arXlsNumber[2] := nRow;
arXlsNumber[3] := nCol;
aFileStream.WriteBuffer(arXlsNumber, SizeOf(arXlsNumber));
aFileStream.WriteBuffer(AValue, 8);
end;
//--------------內嵌寫單元格函式結束-----------------------
begin
//-----------------------主函式體開始------------------------
//單元格記錄的BIFF8定義,直所以用代碼初始化陣列,就是為了函式綠色嘛。。。
arXlsBegin[0]:=$809;arXlsBegin[1]:=8;arXlsBegin[2]:=0;arXlsBegin[3]:=$10;arXlsBegin[4]:=0;arXlsBegin[5]:=0 ;
arXlsEnd[0]:=$0A;arXlsEnd[1]:=0;
arXlsString[0]:=$204;arXlsString[1]:=0;arXlsString[2]:=0;arXlsString[3]:=0;arXlsString[4]:=0;arXlsString[5]:=0;
arXlsNumber[0]:=$203;arXlsNumber[1]:=14;arXlsNumber[2]:=0;arXlsNumber[3]:=0;arXlsNumber[4]:=0;
arXlsInteger[0]:=$27E;arXlsInteger[1]:=10;arXlsInteger[2]:=0;arXlsInteger[3]:=0;arXlsInteger[4]:=0;
arXlsBlank[0]:=$201;arXlsBlank[1]:=6;arXlsBlank[2]:=0;arXlsBlank[3]:=0;arXlsBlank[4]:=$17;
//將DBGrid資料匯出到Excel表
Result:=False;
if ASender=nil then
Exit;
if not Assigned(ASender) then
Exit; //資料表未分配
if ASender.Columns.Count=0 then
Exit;//DBGrid沒有固定列
if not Assigned(ASender.DataSource) then
Exit; //資料源表未分配
if not Assigned(ASender.DataSource.DataSet) then
Exit; //資料集未分配
if not ASender.DataSource.DataSet.Active then
Exit; //資料集未打開
if ASender.DataSource.DataSet.RecordCount=0 then
Exit; //資料集無記錄
if ASender.DataSource.DataSet.RecordCount>65535 then
begin
if Application.MessageBox('由于資料量太多,Excel電子表格只能容納最前面的65535條資料,之后的資料無法匯出,確認要匯出嗎!','提示',MB_ICONQUESTION or MB_YESNO) <>mrYes then
Exit;//用戶放棄匯出
end;
aSaveDlg:=TSaveDialog.Create(nil);
aSaveDlg.FileName := TitleName + '_' + FormatDateTime('YYMMDD', Date);
aSaveDlg.Title:='輸入匯出資料的Excel電子表格檔案名稱';
aSaveDlg.Filter:='Microsoft Excel電子表格檔案|*.XLS';
aSaveDlg.DefaultExt:='XLS';
aSaveDlg.Options:=[ofHideReadOnly,ofFileMustExist,ofPathMustExist];
if not aSaveDlg.Execute then
begin //注意此對話框用戶可能改變程式的“當前檔案夾”位置,函式反會后,為了程式更健壯,建議處理重置當前檔案夾位置
aSaveDlg.Free;
Exit;//檔案打開失敗或用戶撤銷
end;
xlsFileName:=aSaveDlg.FileName;//存盤檔案名稱
aSaveDlg.Free;
if FileExists(xlsFileName) then
DeleteFile(PAnsiChar(xlsFileName)); //如果選擇的匯出檔案存在,先洗掉
aFileStream := TFileStream.Create(xlsFileName, fmCreate);
ASender.DataSource.DataSet.DisableControls;
try
//寫檔案頭
aFileStream.WriteBuffer(arXlsBegin, SizeOf(arXlsBegin));
Col:=0;Row:=0;//內XSL表格坐標變數
//寫列頭,為第0行
for i:=0 to ASender.Columns.Count-1 do
begin //僅匯出選中列的標題,并且該列是可見的,并且列標題沒有字體洗掉線風格
XLSWriteStringCell(Row,Col,ASender.Columns.Items[i].Title.Caption);
Inc(Col);
end;
//寫資料集中的資料,從第1行
Row:=1;Col:=0;
aBookMark := ASender.DataSource.DataSet.GetBookmark;//保存資料集匯出前的游標位置
ASender.DataSource.DataSet.First;
while not ASender.DataSource.DataSet.Eof do
begin
for i := 0 to ASender.Columns.Count-1 do
begin
if Assigned(ASender.Columns[i].Field) then
begin
if Trim(ASender.Columns[i].Field.Text)<>'' then
begin
case ASender.Columns[i].Field.DataType of
ftSmallint, ftInteger, ftWord, ftAutoInc: //整數欄位
XLSWriteIntegerCell(Row,Col,ASender.Columns[i].Field.AsInteger);
ftFloat, ftCurrency, ftBCD://浮點欄位
XLSWriteFloatCell(Row,Col,ASender.Columns[i].Field.AsFloat)
else //其它所有型別欄位,此處用DisplayText,而不用AsString ,為了模仿和DBGrid里面完全一致的顯示效果,所謂的所見即所得效果嘛...
XLSWriteStringCell(Row,Col,ASender.Columns[i].Field.DisplayText);
end;//end of case of
end else begin
XLSWriteStringCell(Row,Col,ASender.Columns[i].Field.DisplayText);
end;
end else begin
lsStr:='';
XLSWriteStringCell(Row,Col,lsStr);
end;
Inc(Col);//一行內增加列數
end;//end of for
if Row=65535 then
Break;//寫完第65535行后(如果有),直接退出回圈,包括標題,最多65536行(行標從0到65535)
Inc(Row);//開始新的一行
Col:=0;//新的一行開始,從第0列開始計數
ASender.DataSource.DataSet.Next;
end;// end of while
//寫檔案尾
aFileStream.WriteBuffer(arXlsEnd, SizeOf(arXlsEnd));
if ASender.DataSource.DataSet.BookmarkValid(aBookMark) then
ASender.DataSource.DataSet.GotoBookmark(aBookMark);//還原資料集匯出前的游標位置
Result:=True;
except
Result:=False;
end; //end of try
//存盤檔案
aFileStream.Free;
ASender.DataSource.DataSet.EnableControls;
TitleName:=xlsFileName;
end;
uj5u.com熱心網友回復:
遇到相同問題,有沒有大神解決啊uj5u.com熱心網友回復:
自己寫一個匯出到EXCEL功能!uj5u.com熱心網友回復:
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/103111.html
標籤:數據庫相關
下一篇:二維條碼列印
