多表头的DBGridEH导出到Excel中
2010-08-04 16:32
429 查看
多表头的DBGridEH导出到Excel中
把自己的解决法子说一下,虽然解决的不是很完美,缺少单元格合并和字体设置。
我重写了单元DBGridEhImpExp中的函数TDBGridEhExportAsXLS.WriteTitle
希望有高手继续完善这个函数,让之最终导出的Excel格式和Elib一样。
//------------------------------------------------------------------
procedure TDBGridEhExportAsXLS.WriteTitle(ColumnsList: TColumnsEhList);
var
i, k: Integer;
FPTitleExpArr: TTitleExpArr;
ListOfHeadTreeNodeList: TList;
ColSpan, RowSpan: Integer;
str1:String;
L: Word; //writestringcell
begin
if ColumnsList.Count = 0 then
Exit;
if DBGridEh.UseMultiTitle then
begin
try
CreateMultiTitleMatrix(DBGridEh, ColumnsList, FPTitleExpArr, ListOfHeadTreeNodeList);
//输出除最后一行表头的内容
for k := ListOfHeadTreeNodeList.Count - 1 downto 1 do
begin
for i := 0 to ColumnsList.Count - 1 do
begin
if THeadTreeNode(TList(ListOfHeadTreeNodeList.Items[k]).Items[i]) <> nil then
begin
CalcSpan(ColumnsList, ListOfHeadTreeNodeList, k, i, ColSpan, RowSpan);
str1:=THeadTreeNode(TList(ListOfHeadTreeNodeList.Items[k]).Items[i]).Text;
//=====================================
L := Length(str1);
CXlsLabel[1] := 8 + L;
CXlsLabel[2] := FRow;
CXlsLabel[3] := FCol;
CXlsLabel[5] := L;
StreamWriteWordArray(Stream, CXlsLabel);
StreamWriteAnsiString(Stream, str1);
if FCol = ExpCols.Count - 1 then
begin
Inc(FRow);
FCol := 0;
end
else
FCol:=FCol+ColSpan;
//=====================================
end;
end;
end;
FRow := ListOfHeadTreeNodeList.Count - 1;
FCol :=0;
//输出最后一行表头
for i := 0 to ColumnsList.Count - 1 do
begin
if THeadTreeNode(TList(ListOfHeadTreeNodeList.Items[0]).Items[i]) <> nil then
begin
CalcSpan(ColumnsList, ListOfHeadTreeNodeList, 0, i, ColSpan, RowSpan);
str1:=THeadTreeNode(TList(ListOfHeadTreeNodeList.Items[0]).Items[i]).Text;
//WriteStringCell(str1);
//==================================
L := Length(str1);
CXlsLabel[1] := 8 + L;
CXlsLabel[2] := FRow;
CXlsLabel[3] := FCol;
CXlsLabel[5] := L*ColSpan;
StreamWriteWordArray(Stream, CXlsLabel);
StreamWriteAnsiString(Stream, str1);
if FCol = ExpCols.Count - 1 then
begin
Inc(FRow);
FCol := 0;
end
else
FCol:=FCol+ColSpan;
//==================================
end
else
begin
Inc(FCol);//单云格进一
end;
end;
FRow:=ListOfHeadTreeNodeList.Count;
FCol:=0;
finally
for i := 0 to ListOfHeadTreeNodeList.Count - 1 do
TList(ListOfHeadTreeNodeList.Items[i]).Free;
ListOfHeadTreeNodeList.Free;
end;
end
else //不使用多表头
begin
for i := 0 to ColumnsList.Count - 1 do
begin
WriteStringCell(ColumnsList[i].Title.Caption);
end;
end;
end;
//------------------------------------------------------------------
把自己的解决法子说一下,虽然解决的不是很完美,缺少单元格合并和字体设置。
我重写了单元DBGridEhImpExp中的函数TDBGridEhExportAsXLS.WriteTitle
希望有高手继续完善这个函数,让之最终导出的Excel格式和Elib一样。
//------------------------------------------------------------------
procedure TDBGridEhExportAsXLS.WriteTitle(ColumnsList: TColumnsEhList);
var
i, k: Integer;
FPTitleExpArr: TTitleExpArr;
ListOfHeadTreeNodeList: TList;
ColSpan, RowSpan: Integer;
str1:String;
L: Word; //writestringcell
begin
if ColumnsList.Count = 0 then
Exit;
if DBGridEh.UseMultiTitle then
begin
try
CreateMultiTitleMatrix(DBGridEh, ColumnsList, FPTitleExpArr, ListOfHeadTreeNodeList);
//输出除最后一行表头的内容
for k := ListOfHeadTreeNodeList.Count - 1 downto 1 do
begin
for i := 0 to ColumnsList.Count - 1 do
begin
if THeadTreeNode(TList(ListOfHeadTreeNodeList.Items[k]).Items[i]) <> nil then
begin
CalcSpan(ColumnsList, ListOfHeadTreeNodeList, k, i, ColSpan, RowSpan);
str1:=THeadTreeNode(TList(ListOfHeadTreeNodeList.Items[k]).Items[i]).Text;
//=====================================
L := Length(str1);
CXlsLabel[1] := 8 + L;
CXlsLabel[2] := FRow;
CXlsLabel[3] := FCol;
CXlsLabel[5] := L;
StreamWriteWordArray(Stream, CXlsLabel);
StreamWriteAnsiString(Stream, str1);
if FCol = ExpCols.Count - 1 then
begin
Inc(FRow);
FCol := 0;
end
else
FCol:=FCol+ColSpan;
//=====================================
end;
end;
end;
FRow := ListOfHeadTreeNodeList.Count - 1;
FCol :=0;
//输出最后一行表头
for i := 0 to ColumnsList.Count - 1 do
begin
if THeadTreeNode(TList(ListOfHeadTreeNodeList.Items[0]).Items[i]) <> nil then
begin
CalcSpan(ColumnsList, ListOfHeadTreeNodeList, 0, i, ColSpan, RowSpan);
str1:=THeadTreeNode(TList(ListOfHeadTreeNodeList.Items[0]).Items[i]).Text;
//WriteStringCell(str1);
//==================================
L := Length(str1);
CXlsLabel[1] := 8 + L;
CXlsLabel[2] := FRow;
CXlsLabel[3] := FCol;
CXlsLabel[5] := L*ColSpan;
StreamWriteWordArray(Stream, CXlsLabel);
StreamWriteAnsiString(Stream, str1);
if FCol = ExpCols.Count - 1 then
begin
Inc(FRow);
FCol := 0;
end
else
FCol:=FCol+ColSpan;
//==================================
end
else
begin
Inc(FCol);//单云格进一
end;
end;
FRow:=ListOfHeadTreeNodeList.Count;
FCol:=0;
finally
for i := 0 to ListOfHeadTreeNodeList.Count - 1 do
TList(ListOfHeadTreeNodeList.Items[i]).Free;
ListOfHeadTreeNodeList.Free;
end;
end
else //不使用多表头
begin
for i := 0 to ColumnsList.Count - 1 do
begin
WriteStringCell(ColumnsList[i].Title.Caption);
end;
end;
end;
//------------------------------------------------------------------
相关文章推荐
- delphi dbgrideh导出到Excel 多表头
- Html Table用JS导出excel格式问题 导出EXCEL后单元格里的000412341234会变成412341234 7-14 会变成 2018-7-14(7月14) 自定义格式 web利用table表格生成excel格式问题 js导出excel增加表头、mso-number-format定义数据格式 数字输出格式转换 mso-number-format:"\@"
- dbgrideh快速导出excel
- POI导出EXCEL文档、水平垂直居中、表头添加颜色
- 项目中使用POI导出Excel的一些心得(包含复杂表头和动态页数与列数)
- poi导出Excel报表多表头双层表头、合并单元格
- phpexcel导出数据,用数组遍历导出表头
- 快逸导出Excel支持锁定表头
- java导出excel设置表头
- POI导出EXCEL文档、水平垂直居中、表头添加颜色
- Easyui+Spring Mvc导出Excel:支持按模板样式导出、合并表头、合并单元格、多sheet
- DbgridEh数据导出到Excel的方法(Delphi)
- js导出excel增加表头、mso-number-format定义数据格式
- 多表头导出Excel
- [转] C# DataTable 导出 Excel 进阶 多行表头、合并单元格、中文文件名乱码
- Ehlib 的 DBGridEh 控件导出到Excel的三种封装过程/函数
- POI导出EXCEL文档、水平垂直居中、表头添加颜色
- C# WinForm DataTable 导出 Excel 多行表头、合并单元格
- 导出Excel(兼容各主流浏览器,也可手动设置表头)
- java-导入到Excel_POI根据模板(excel表头)导出excel