非OLE方式写EXCEL

奔雷手 2013-08-30 12:22:27
DGStorage为 stringgrid

try
if Length(FullExcelFileName) <= 0 then
begin
if SaveDialog1.Execute then
begin
LocalFileName := SaveDialog1.Files[0];
end else
begin
Result := False;
Exit;
end;
end else
LocalFileName := FullExcelFileName;
RowString := '';
AssignFile(ExcelFile, LocalFileName);
Rewrite(ExcelFile);
try
Write(ExcelFile, RowString);
for i := 0 to DGStorage.RowCount - 1 do
begin
for j := 0 to DGStorage.ColCount - 1 do
begin
if j > 0 then
begin
RowString := RowString + #9 + DGStorage.cells[j, i];
end else
begin
RowString := DGStorage.cells[j, i]; ;
end;
end;
RowString := #13 + #10 + RowString;
Write(ExcelFile, RowString);
RowString := '';
end;
finally
CloseFile(ExcelFile);
end;
Result := True;
except
Result := False;
end;


在D7下 从STRINGGRID导出到EXCEL 中 正常的。
在DXE下从STRINGGRID导出到EXCEL中有个怪异的现象
比如说CTRL+F7 查询到
RowString	'11  '#9'1113111112101245  '#9'上海金杨鞋柜  '#9'1  '#9'2013-08-04  '
时 写入EXCEL中的第二个字符由1113111112101245变成了
1113111112101240 ,如果把这个语句中间加个 特殊字符
RowString := RowString + #9 + DGStorage.cells[j, i]+'|';

则又是正常的1113111112101245。
...全文
203 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
奔雷手 2013-09-06
  • 打赏
  • 举报
回复
OLE解决。不过在XE版本以上
xlsApp.ActiveWorkbook.ActiveSheet.cells[j,2].NumberFormatLocal:='@';
这个是不行的。要转换成ANSISTRING
奔雷手 2013-09-03
  • 打赏
  • 举报
回复
算了还是用OLE吧。
orxor 2013-09-02
  • 打赏
  • 举报
回复
自己解析XLS?
奔雷手 2013-09-02
  • 打赏
  • 举报
回复
引用 7 楼 reverzeng 的回复:
NumberFormatLocal:='@' 用这个可以喔,如果不行的话,还真不知道为什么.
这个是通过OLE方式的。 但我现在这个方法不是用OLE(因为不清楚客户机上装的是WPS还是MSOFFICE还是OPENOFFICE还是其他的。)。 我采用的是写TXT文件方式写EXCEL。
奔雷手 2013-09-02
  • 打赏
  • 举报
回复
引用 6 楼 xstdljj 的回复:
[quote=引用 5 楼 reverzeng 的回复:] 导出时定义excel单元格为文本,就不用单引号了,直接按文本来处理了
好像没用,我以前遇到过这个问题,类似下面这样的格式我都试过,都不行,最后还是用的加' 的方法
xlsApp.ActiveWorkbook.ActiveSheet.cells[j,1].NumberFormatLocal:='G/通用格式';
xlsApp.ActiveWorkbook.ActiveSheet.cells[j,2].NumberFormatLocal:='@';
[/quote] 这个是通过OLE方式的。 但我现在这个方法不是用OLE(因为不清楚客户机上装的是WPS还是MSOFFICE还是OPENOFFICE还是其他的。)。 我采用的是写TXT文件方式写EXCEL。
reverzeng 2013-08-31
  • 打赏
  • 举报
回复
导出时定义excel单元格为文本,就不用单引号了,直接按文本来处理了
reverzeng 2013-08-31
  • 打赏
  • 举报
回复
NumberFormatLocal:='@' 用这个可以喔,如果不行的话,还真不知道为什么.
鐵蛋 2013-08-31
  • 打赏
  • 举报
回复
引用 5 楼 reverzeng 的回复:
导出时定义excel单元格为文本,就不用单引号了,直接按文本来处理了
好像没用,我以前遇到过这个问题,类似下面这样的格式我都试过,都不行,最后还是用的加' 的方法
xlsApp.ActiveWorkbook.ActiveSheet.cells[j,1].NumberFormatLocal:='G/通用格式';
xlsApp.ActiveWorkbook.ActiveSheet.cells[j,2].NumberFormatLocal:='@';
tcmakebest 2013-08-30
  • 打赏
  • 举报
回复
这很明显,这个值被当成数字进行处理的时候,无法保持这么高的精度,那就当作字符串来处理吧。
奔雷手 2013-08-30
  • 打赏
  • 举报
回复
引用 2 楼 lch0422 的回复:
[quote=引用 1 楼 tcmakebest 的回复:] 这很明显,这个值被当成数字进行处理的时候,无法保持这么高的精度,那就当作字符串来处理吧。
不太明白。
 RowString := RowString + #9 + VARTOSTR(DGStorage.cells[j, i]);
问题还是一样。[/quote] 了解了。这是超长了。前面须得加上 单引号。
RowString := RowString + #9 +#39+DGStorage.cells[j, i]
这样之后呢导出之后是这样的 '1113111112101245 要双击每个单元格才会显示出格式是 文本类型的1113111112101245 。 有没有解决方法啊。
奔雷手 2013-08-30
  • 打赏
  • 举报
回复
发现一个现象 打开EXCEL 赋值 1113111112101245 到表格中任何一个位置。 就会发现 变成了1113111112101240。
奔雷手 2013-08-30
  • 打赏
  • 举报
回复
引用 1 楼 tcmakebest 的回复:
这很明显,这个值被当成数字进行处理的时候,无法保持这么高的精度,那就当作字符串来处理吧。
不太明白。
 RowString := RowString + #9 + VARTOSTR(DGStorage.cells[j, i]);
问题还是一样。

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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