Блог


Последние записи


Теги

Информация

Delphi, DevExpress, примеры, решения

Фильтр по тегу: экспорт


cxGrid - экспорт многоуровневого грида

Как экспортировать master-detail cxGrid?

По умолчанию, содержимое только одного представления (View) экспортируется в Excel. Не важно, какое именно представление должно быть экспортировано, мастер или деталь, единственное ограничение - экспортируемое представление (view) должно быть сфокусировано.

Итак, чтобы экспортировать предствление (View), выполните:
1) установите фокус на View;
2) вызовите метод ExportGrid4ToExcel.

Используя этот подход, вы можете экспортировать содержимое всех представление cxGrid`а в Excel. Единственное ограничение этого метода - вся информация будет сохранена в разных файлах.

Для фокусировки можно использовать свойство Focused у нужного представления (view) или указать нужное представление в свойстве FocusedView у cxGrid`а.

Отсюда: http://www.devexpress.com/Support/Center/KB/p/A1113.aspx
добавлено: 13 июл 12 просмотры: 2039, комментарии: 0



Экспорт дерева cxTreeList

Экспорт данных из TcxTreeList

В последних версиях DevExpress уже реализован экспорт дерева cxTreeList в разные форматы:
cxExportTLToText()
cxExportTLToXML()
cxExportTLToHTML()
cxExportTLToExcel()

не забудьте добавить в USES модуль cxTLExportLink


Есть отдельная самописная процедура экспорта дерева в эксель.
+
+ Экспорт данных из TcxTreeList
unit uTreeExport;
interface

uses
  Excel97,
  dxTL;

procedure ExportTreeToExcel(ATree: TCustomdxTreeListControl);

implementation

uses
{$IFDEF VER140}
  Variants,
{$ENDIF}
  MyExcel;

const
  // Кол-во записей, экспортируемых за раз
  BufferSize = 5;

procedure ExportTreeToExcel(ATree: TCustomdxTreeListControl);
var
  Buffer: Variant;
  Sheet: ExcelWorkSheet;
  MaxTreeLevel, BufferIndex, LastSavedRow: integer;

function GetMaxTreeLevel: integer;
var
  ANode: TdxTreeListNode;
begin
  Result := 0;
  ANode := ATree.TopNode;
  while Assigned(ANode) do
  begin
    if ANode.Level > Result then
      Result := ANode.Level;
    ANode := ANode.GetNext;
  end;
end;

procedure PrepareExport;
var
  i: integer;
  ARange: Range;
begin
  AddWorkBook;
  Sheet := XL.Workbooks[1].Sheets[1] as ExcelWorkSheet;
  Sheet.Cells.ColumnWidth := 2; // = 19 пикселей
  BufferIndex := 0;
  LastSavedRow := 2;
  MaxTreeLevel := GetMaxTreeLevel;
  Buffer := VarArrayCreate(
    [0, BufferSize, 0, MaxTreeLevel + ATree.VisibleColumnCount],
    VarVariant
  );
  for i := 0 to ATree.VisibleColumnCount - 1 do
    Buffer[0, MaxTreeLevel + i] := ATree.VisibleColumns[i].Caption;
  ARange := Sheet.Range[
    GetAddress(1, 1),
    GetAddress(1, MaxTreeLevel + ATree.VisibleColumnCount)
  ];
  ARange.Value := Buffer;
  ARange.Font.Bold := true;
end;

procedure SaveBuffer(ABufferSize: integer);
var
  i, j: integer;
  Dest: Range;
begin
  Dest := Sheet.Range[
    GetAddress(LastSavedRow, 1),
    GetAddress(LastSavedRow + ABufferSize - 1, MaxTreeLevel + ATree.VisibleColumnCount)
  ];
  Dest.Value := Buffer;
  for i := 0 to BufferSize do
    for j := 0 to MaxTreeLevel + ATree.VisibleColumnCount do
      Buffer[i, j] := null;
end;

procedure ExportNode(ANode: TdxTreeListNode);
var
  i: integer;
begin
  for i := 0 to ATree.VisibleColumnCount - 1 do
  begin
    if i = 0 then
      Buffer[BufferIndex, ANode.Level] :=
        ANode.Values[ATree.VisibleColumns[i].Index]
    else
      Buffer[BufferIndex, MaxTreeLevel + i] :=
        ANode.Values[ATree.VisibleColumns[i].Index]
  end;
  Inc(BufferIndex);
  if BufferIndex = BufferSize then
  begin
    SaveBuffer(BufferSize);
    BufferIndex := 0;
    Inc(LastSavedRow, BufferSize);
  end;
end;

procedure FitWidth;
var
  i: integer;
  ColumnName: string;
begin
  for i := 0 to ATree.VisibleColumnCount - 1 do
  begin
    if i < 26 then
      ColumnName := Chr(Ord('A') + i)
     else
      ColumnName :=
        Chr(Ord('A') + (i div 26) - 1) +
        Chr(Ord('A') + (i mod 26));
    Sheet.Cells.Item[ColumnName, ColumnName].EntireColumn.AutoFit;
  end;
end;

procedure ExportData;
var
  ANode: TdxTreeListNode;
begin
  ANode := ATree.TopNode;
  while Assigned(ANode) do
  begin
    ExportNode(ANode);
    ANode := ANode.GetNext;
  end;
  SaveBuffer(BufferIndex);
  //FitWidth;
end;

begin
  CreateExcel;
  try
    PrepareExport;
    ExportData;
    ShowExcel;
    Sheet := nil;
  finally
    ReleaseExcel;
  end;
end;
end.




Исходник модуля MyExcel из USES:

++
+ Исходник модуля MyExcel
unit MyExcel;

interface

uses
Windows, Excel97, Forms;

procedure CreateExcel(Form: TForm);
procedure ReleaseExcel(Form: TForm);
procedure ShowExcel;
procedure HideExcel;
function AddWorkbook: ExcelWorkbook;
function OpenWorkbook(const BookName: string): ExcelWorkbook;
procedure CloseWorkbook(var Workbook: ExcelWorkbook);
function GetAddress(Row, Column: integer): string;
function GetBook(BookIndex: OleVariant): ExcelWorkbook;
function GetSheet(Workbook: ExcelWorkbook;
SheetIndex: OleVariant): ExcelWorksheet;
function SaveWorkbook(Book: ExcelWorkbook; Name: string): boolean;
procedure BoldRange(CRange: Excel97.Range);

var
XL: TExcelApplication;
FLCID: LCID;

implementation

uses
OleServer, OleCtrls, ActiveX, ComObj, Classes, SysUtils;

procedure CreateExcel(Form: TForm);
begin
FLCID := LOCALE_USER_DEFAULT;
if not Assigned(XL) then
begin // TOleServer
XL := Excel97.TExcelApplication.Create(Form);
XL.ConnectKind := ckNewInstance;
XL.Connect;
end;
end;

procedure ShowExcel;
begin// TLanguages
if Assigned(XL) then begin // а если он не создан?
XL.Visible[FLCID] := true;
if XL.WindowState[FLCID] = xlWindowState(xlMinimized) then
XL.WindowState[FLCID] := XlWindowState(xlNormal);
XL.ScreenUpdating[FLCID] := true;
end;
end;

procedure HideExcel;
begin
if Assigned(XL) then
XL.Visible[FLCID] := false;
end;

procedure ReleaseExcel(Form: TForm);
begin
if Assigned(XL) then begin
if (XL.Workbooks.Count > 0) then begin
XL.WindowState[FLCID] := TOLEEnum(xlMaximized);
XL.Visible[FLCID] := true;
{
if not(csDestroying in Form.ComponentState) then
Form.SetFocus;
Application.BringToFront;
}
end;
FreeAndNil(XL);
end;
end;

function AddWorkbook: ExcelWorkbook;
begin
Result := nil;
XL.SheetsInNewWorkbook[FLCID] := 1;
if Assigned(XL) then
Result := XL.Workbooks.Add(EmptyParam, FLCID);
end;

procedure CloseWorkbook(var Workbook: ExcelWorkbook);
begin
if not Assigned(Workbook) then Exit;
Workbook.Close(false, EmptyParam, EmptyParam, FLCID);
WorkBook := nil;
end;

function OpenWorkbook(const BookName: string): ExcelWorkbook;
begin
try
Result := XL.Workbooks.Open(BookName, false, false,
EmptyParam, EmptyParam, false, true, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam,
false, FLCID);
except on EOleException do
Result := nil;
end;
end;

function GetAddress(Row, Column: integer): string;
begin
// Max - 2 chars
Column := Column - 1;
if Column < 26 then
Result := Chr(Ord('A') + Column)
else
Result := Chr(Ord('A') + (Column div 26) - 1) +
Chr(Ord('A') + (Column mod 26));
Result := Result + IntToStr(Row);
end;

function GetBook(BookIndex: OleVariant): ExcelWorkbook;
begin
try
Result := XL.Workbooks.Item[BookIndex];
except on EOleException do
Result := nil;
end;
end;

function GetSheet(Workbook: ExcelWorkbook;
SheetIndex: OleVariant): ExcelWorksheet;
begin
try
Result := Workbook.Worksheets.Item[SheetIndex] as ExcelWorksheet;
except on EOleException do
Result := nil;
end;
end;

function SaveWorkbook(Book: ExcelWorkbook; Name: string): boolean;
begin
Result := true;
XL.DisplayAlerts[FLCID] := false;
try
Book.SaveAs(Name, xlFileFormat(xlWorkbookNormal), '', '',
false, false, xlSaveAsAccessMode(xlExclusive),
EmptyParam, EmptyParam, EmptyParam, EmptyParam, FLCID);
except on EOleException do
Result := false;
end;
XL.DisplayAlerts[FLCID] := true;
end;

procedure BoldRange(CRange: Excel97.Range);
begin
CRange.Borders.Item[xlEdgeLeft].Weight :=
XlBorderWeight(xlMedium);
CRange.Borders.Item[xlEdgeRight].Weight :=
XlBorderWeight(xlMedium);
CRange.Borders.Item[xlEdgeTop].Weight :=
XlBorderWeight(xlMedium);
CRange.Borders.Item[xlEdgeBottom].Weight :=
XlBorderWeight(xlMedium);
end;

end.



Отсюда:https://www.sql.ru/forum/actualthread.aspx?tid=195551&pg=1&mid=1655422#1655422
добавлено: 13 июл 12 просмотры: 1918, комментарии: 2