VirtualStringTreeを Excel または CSVにエクスポートできますか?
Delphi 2007 を使用しており、VirtualStringTree データ レコードを Excel または CSV 形式で保存しようとしています。
VirtualStringTreeを Excel または CSVにエクスポートできますか?
Delphi 2007 を使用しており、VirtualStringTree データ レコードを Excel または CSV 形式で保存しようとしています。
ExcelWriterあらゆる種類のものを Excel にダンプできるヘルパー クラスがあります。
この場合、高速な方法 (ここで簡単にコピーして貼り付けることができます) は、バリアント配列を Excel にダンプできるオーバーロードです。
class function TExcelWriter.ExportToExcelVariantArray(const VArray: Variant; const Title, SubTitle: WideString): Boolean;
var
xl: OleVariant;
workbook: OleVariant;
worksheet: OleVariant;
range: OleVariant;
Rowcount, ColumnCount: Integer;
HeaderRowIndex: Integer;
s: WideString;
begin
Result := False;
if not VarIsArray(VArray) then
raise EExcelWriterException.Create('ExportToExcelVariantArray: Supplied variant is not an array');
if VarArrayDimCount(VArray) <> 2 then
raise EExcelWriterException.Create('ExportToExcelEVariantArray: Supplied variant array does not have 2 dimensions ('+IntToStr(VarArrayDimCount(VArray))+')');
ColumnCount := VarArrayHighBound(VArray, 2) - VarArrayLowBound(VArray, 2); //2 for "leftmost dimension"
rowCount := VarArrayHighBound(VArray, 1) - VarArrayLowBound(VArray, 1); //1 for "leftmost dimension"
try
xl := CreateOleObject('Excel.Application');
except
on E:Exception do
begin
if (E is EOleSysError) then
begin
if EOleSysError(E).ErrorCode = CO_E_CLASSSTRING then
raise EExcelWriterException.Create('Excel is not installed.'+CRLF+
'Could not load "Excel.Application" object (Co_E_CLASSSTRING)')
else
raise;
end
else
raise;
end;
end;
try
xl.ScreenUpdating := False;
xl.DisplayAlerts := False; // Don't display dialogs such as "save changes to workbook".
workbook := xl.Workbooks.Add;
try
Worksheet := Workbook.Worksheets[1];
try
Worksheet.Activate;
Worksheet.Cells.WrapText := False;
HeaderRowIndex := 1; //Rows&Columns in Excel start at one.
range := TExcelWriter.GetRange(worksheet, HeaderRowIndex, 1, HeaderRowIndex+RowCount, ColumnCount);
range.Value := VArray;
//Bold the header row
Worksheet.Rows[HeaderRowIndex].Font.Bold := True;
Worksheet.Rows[HeaderRowIndex].Font.Underline := True;
Worksheet.Columns.AutoFit;
//Set printed header&footer
if Copy(Title, 1, 2) = '@@' then
s := Copy(Title, 3, MaxInt)
else
s := Title;
if SubTitle <> '' then
begin
if s <> '' then s := s+#13;
s := s + SubTitle;
end;
TExcelWriter.SetHeaderAndFooters(Worksheet,
s, '', '',
'&D &T', '', 'Page &P of &N');
finally
Worksheet := Unassigned;
end;
finally
Workbook := Unassigned;
end;
//When all done
xl.ScreenUpdating := True;
xl.Visible := True;
xl.UserControl := True; // Very important, prevents Excel from going
// away when we nil out our reference to it below.
finally
xl := Unassigned;
end;
Result := True;
end;
VirtualTrees への移行を容易にする のTVirtualListView子孫があります( などがあります)。次に、 andに似たヘルパー メソッドがあります。TVirtualStringTreeTVirtualListItemContentToVariantArrayContentToHtmlContentToRtf
function TVirtualListView.ContentToVariantArray: Variant;
var
Columns: TColumnsArray;
VArray: Variant;
Node: PVirtualNode;
ColumnCount: Integer;
RowCount: Integer;
nRow: Integer;
i: Integer;
begin
Columns := Self.Columns.GetVisibleColumns;
ColumnCount := Length(Columns);
RowCount := Self.Items.Count+1; //+1 for the heaader
VArray := VarArrayCreate([0, RowCount-1, 0, ColumnCount-1], varOleStr); //Docs say cannot use varString, must be varOleStr (which is a BSTR i.e. WideString)
nRow := 0;
for i := 0 to ColumnCount-1 do
begin
VArray[nRow, i] := Self.Columns.Items[Columns[i].Index].Text;
end;
Node := Self.GetFirst;
while Assigned(Node) do
begin
Inc(nRow);
for i := 0 to ColumnCount-1 do
begin
VArray[nRow, i] := Self.Text[Node, Columns[i].Index];
end;
Node := Self.GetNextSibling(Node);
end;
Result := VArray;
end;
ここでの主な欠点は、Excel を使用するために自動化していることです。これは、顧客/サーバーに Excel をインストールする必要があることを意味します。
上記のコードは、エクスポート ファイルを作成するのではなく、ユーザー Excel を示しています (ファイルを表示するためだけにハード ドライブにファイルを保存する必要があるのは無駄です)。.Saveしかし、呼び出しや API が何であれ、難しいことではありません。
CSVの方が簡単です。
VirtualStringTree にはデータが含まれておらず、仮想コンテナーであるため、データは独自のデータです。したがって、仮想文字列ツリーが TMyObjects リスト (コンテナー) のビューである場合、CSV への出力は比較的簡単で、仮想ツリーの内容は、列が異なる順序である場合にのみ重要になります。表示される列のセットが完了します。
無料の JVCL JvCsvDataSet を調査することをお勧めします。これは、CSV ファイルを作成するための非常に簡単な方法です。
本当に XLS 出力が必要な場合は、そのためのライブラリがあります。
CSV を書くと、それがビルドされます (html と同じ):
var ss : AnsiString;
...
if ExtractFileExt(DestFileName)='.htm'
then
ss:=VST.ContentToHtml(tstAll, 'Html exp')
else
ss:=VST.ContentToText(tstAll, ';');
with TFileStream.Create(DestFileName, fmCreate or fmShareDenyWrite) do
begin
Write(ss[1], length(ss));
Free;
end;