开发工具:delphi7+SQL2000从系统导出的EXCEL文件无法用exce2010打开:
用DBGRIDEh控件直接导出一个excel文件,发现无法用excel2010打开,一打开报错:
‘Microsoft Excel 遇到问题需要关闭。我们对此引起的不便表示抱歉’。2. 若是不用DBGRIDEh控件,用delphi自带控件一行一行的往Excel写数据,也没有问题。之前用的是Excel2003没有问题,装了2010后就出现了上面的状况。若是转出的EXCEL文件先用2003打开,再另存,然后在用2010打开,又是可以的。
上网查了查说是版本的问题,按道理excel版本是向下兼容的,不应该出现这样的情况。请问,谁也遇到过这样的情况,有没有解决办法?
用DBGRIDEh控件直接导出一个excel文件,发现无法用excel2010打开,一打开报错:
‘Microsoft Excel 遇到问题需要关闭。我们对此引起的不便表示抱歉’。2. 若是不用DBGRIDEh控件,用delphi自带控件一行一行的往Excel写数据,也没有问题。之前用的是Excel2003没有问题,装了2010后就出现了上面的状况。若是转出的EXCEL文件先用2003打开,再另存,然后在用2010打开,又是可以的。
上网查了查说是版本的问题,按道理excel版本是向下兼容的,不应该出现这样的情况。请问,谁也遇到过这样的情况,有没有解决办法?
有些报表转出后,还会设置公式什么的,保存为CSV文件不行。
这些报错也出现在导入过程,用户都是直接在EXCEL文件中作业,然后导入系统,让他们另存为CSV格式再导入估计也不现实。
建议使用XLS4控件,生成的EXCEL无问题。
procedure DBGridSaveXLS(aDBGrid: TDBGrid; sFileName: string);
function LineFeedsToXLS(s:string):string;
var
Res: string;
i: Integer;
begin
Res := '';
for i := 1 to Length(s) do
if s[i] <> #13 then
Res := Res + s[i];
Result:=res;
end;
var
FExcel: Variant;
FWorkbook: Variant;
FWorksheet: Variant;
FArray: Variant;
s, z: Integer;
RangeStr, sTitle: string;
aBookMark: TBookMark;
StrtCol, StrtRow, RowCount, ColCount: Integer;
begin
Screen.Cursor := crHourGlass; try
FExcel := CreateOleObject('excel.application');
except
Screen.cursor := crDefault;
MessageDlg('Could not start Microsoft Excel!', mtError, [mbCancel], 0);
Exit;
end; aBookMark := aDBGrid.DataSource.DataSet.GetBookMark;
aDBGrid.DataSource.DataSet.DisableControls;
try
StrtCol := 0;
StrtRow := 0;
FWorkBook := FExcel.WorkBooks.Add;
//FWorkSheet := FWorkBook.WorkSheets.Add;
FWorkSheet := FExcel.WorkBooks[1].WorkSheets[1];
RowCount := aDBGrid.DataSource.DataSet.RecordCount + 1;//加上標題行
ColCount := aDBGrid.Columns.Count;
FArray := VarArrayCreate([0, RowCount - 1 - StrtRow, 0, ColCount - 1 - StrtCol], VarVariant); //Title
for z := StrtCol to ColCount - 1 do
begin
sTitle := aDBGrid.Columns[z].Title.Caption;
if sTitle = '' then
sTitle := aDBGrid.Columns[z].FieldName;
FArray[0, z - StrtCol] := LineFeedsToXLS(sTitle);
end; //data
{for s := StrtRow to RowCount - 1 do
for z := StrtCol to ColCount - 1 do
FArray[s - StrtRow, z - StrtCol] := LineFeedsToXLS();}
s := 1;//s := StrtRow;
aDBGrid.DataSource.DataSet.First;
while not aDBGrid.DataSource.DataSet.Eof do
begin
for z := StrtCol to ColCount - 1 do
FArray[s - StrtRow, z - StrtCol] := LineFeedsToXLS(aDBGrid.Columns[z].Field.DisplayText);
Inc(s);
aDBGrid.DataSource.DataSet.Next;
end; RangeStr := 'A1:'; if (ColCount - StrtCol) > 26 then
begin
if (ColCount - StrtCol) mod 26 = 0 then
begin
RangeStr := RangeStr + Chr(Ord('A') - 2 + ((ColCount - StrtCol) div 26));
RangeStr := RangeStr + 'Z';
end
else
begin
RangeStr := RangeStr + Chr(Ord('A') - 1 + ((ColCount - StrtCol) div 26));
RangeStr := RangeStr + Chr(Ord('A') - 1 + ((ColCount - StrtCol) mod 26));
end;
end
else
RangeStr := RangeStr + Chr(Ord('A') - 1 + (ColCount - StrtCol)); RangeStr := RangeStr + IntToStr(RowCount - StrtRow); FWorkSheet.Range[RangeStr].Value := FArray; if sFileName <> '' then
begin
FWorkbook.SaveAs(sFileName);
FExcel.Quit;
FExcel := unAssigned;
end
else
FExcel.Visible := True;
finally
aDBGrid.DataSource.DataSet.GotoBookMark(aBookMark);
aDBGrid.DataSource.DataSet.EnableControls;
aDBGrid.DataSource.DataSet.FreeBookMark(aBookMark);
Screen.Cursor := crDefault;
end;
end;
var
pExpClass: TDBGridEhExportClass; //导出文件类型
pExt:string ; //导出文件扩展名
pExpFile:string; //导出文件路径及文件名称
pExpFileExt:string; //SaveDialog1返回的文件名的扩展名
ExcelApp: Variant; //Excel变量
Ret:integer;
begin
Ret := Application.MessageBox(pchar('是否只导出选中的数据?'
+#13+#10+#13+#10+' 确认 - 选中部分'
+#13+#10+#13+#10+' 取消 - 全部'),pchar(Application.title),MB_OKCANCEL); SaveDialog1.FileName := '';
if SaveDialog1.Execute then
begin
pExpClass := TDBGridEhExportAsXLS;
pExt := 'xls'; pExpFile:= trim(SaveDialog1.FileName);
if UpperCase(Copy(pExpFile,Length(pExpFile)-2,3)) <> UpperCase(pExt) then
pExpFile := pExpFile + '.' + pExt;
if Ret = IDOK then
SaveDBGridEhToExportFile(pExpClass,DBGridEh2,pExpFile,False)
else
SaveDBGridEhToExportFile(pExpClass,DBGridEh2,pExpFile,true); ExcelApp := CreateOleObject('Excel.Application');
ExcelApp.Visible := true;
ExcelApp.WorkBooks.Open(pExpFile);
ExcelApp.WorkSheets[1].Activate; end;
end;
我的xe2中怎么没有你说的dbgrideh控件啊?
提示:文件已损坏,无法打开
用2003,2007都可以正常打开,唯独2010打不开,2010以上的版本没试过SaveDBGridEhToExportFile(pExpClass,dbgrdh1,pExpFile,True)
你试试03打开另存为97或者以上格式版本
你试试03打开另存为97或者以上格式版本不会的,我用2000,2003,2007,2010,2013分别打开过了
只有2010无法打开呢
做个标记,建议使用cxgrid...自带导出!