|
![]() | 作者: advantech [advantech]
![]() |
登录 |
access建的的一个表,表中有一个是长二进制数据的字段,如何才能将这个表导到excel中? |
地主 发表时间: 05-10-01 14:48 |
![]() | 回复: zhoen889 [zhoen889] ![]() |
登录 |
(1)快速导出数据到Excel(三):利用Excel内置功能 -------------------------------------------------------------------------------- 去Baidu(百度)搜索┊去Yisou(一搜)搜索┊去Google搜索┊ -------------------------------------------------------------------------------- 将数据导出到Excel的方法有多种,速度有快慢之分,我用过三种方法,速度都比较快,下面的一种利用Excel内置的功能,是三种之中最快的。其中最主要的是下面两句: xlQuery := xlSheet.QueryTables.Add(ADOQExport.Recordset ,xlSheet.Range['A3']); xlQuery.Refresh; 不过我这里稍为复杂一点,要通过某种条件完成分类汇总。 function ExportToExcel: Boolean; var xlApp, xlBook, xlSheet, xlQuery: Variant; SQLCmd: String; i, iNextRow: Integer; //设定单元格默认格式 procedure ExcelSetDefaultFormat; begin xlSheet.Cells.Font.Name := '宋体'; xlSheet.Cells.Font.Size := 12; xlSheet.Cells.VerticalAlignment := 2; //xlSheet.Cells.RowHeight := 17.25; xlSheet.Range['C:D'].HorizontalAlignment := xlCenter; end; //输出标题 procedure ExcelSetHeader; begin xlSheet.Range['A1'].Value := '显示在报表第一行的标题'; xlSheet.Range['A1:F1'].HorizontalAlignment := 7; xlSheet.Range['1:1'].Font.Size := 18; xlSheet.Range['1:1'].Font.Bold := true; xlSheet.Range['A2'].Value := '文件编号:WL/B 19'; xlSheet.Range['A2'].Font.Size := 11; xlSheet.Range['F2'].Value := '记录编号:GZ-023'; xlSheet.Range['F2'].HorizontalAlignment := xlRight; xlSheet.Range['F2'].Font.Size := 11; xlSheet.Range['A3'].Value := 'XXXXX有限公司'; xlSheet.Range['F3'].Value := '日期:2005-X-X' ; xlSheet.Range['F3'].HorizontalAlignment := xlRight; //输出字段名 ADOQExport.SQL.Strings[4] := 'where 1=0'; if ADOQExport.Active then ADOQExport.Requery else ADOQExport.Open; xlQuery := xlSheet.QueryTables.Add(ADOQExport.Recordset ,xlSheet.Range['A4']); xlQuery.FieldNames := true; xlQuery.RowNumbers := False; xlQuery.FillAdjacentFormulas := False; xlQuery.PreserveFormatting := True; xlQuery.RefreshOnFileOpen := False; xlQuery.BackgroundQuery := True; xlQuery.RefreshStyle := xlOverwriteCells; //xlInsertDeleteCells; xlQuery.SavePassword := True; xlQuery.SaveData := True; xlQuery.AdjustColumnWidth := True; xlQuery.RefreshPeriod := 0; xlQuery.PreserveColumnInfo := True; xlQuery.Refresh; iNextRow := 5; end; //设置页脚 procedure ExcelSetFooter; begin xlSheet.PageSetup.LeftFooter := '制表:' + DM.UserInfo.UserName; xlSheet.PageSetup.CenterFooter := '审核:'; xlSheet.PageSetup.RightFooter := '第 &P 页,共 &N 页'; end; //输出汇总数据 procedure ExcelSetSum; begin xlSheet.Range[Format('A%d', [iNextRow])].Value := '条数合计(条)'; xlSheet.Range[Format('A%d:B%0:d', [iNextRow])].HorizontalAlignment := 7; xlSheet.Range[Format('C%d', [iNextRow])].Value := FloatToStr(DBGridEh1.Columns[6].Footer.SumValue); xlSheet.Range[Format('C%d:F%0:d', [iNextRow])].HorizontalAlignment := 7; xlSheet.Range[Format('A%d:F%0:d', [iNextRow])].Font.Bold := true; Inc(iNextRow); xlSheet.Range[Format('A%d', [iNextRow])].Value := '重量合计(kg)'; xlSheet.Range[Format('A%d:B%0:d', [iNextRow])].HorizontalAlignment := 7; xlSheet.Range[Format('C%d', [iNextRow])].Value := FloatToStr(DBGridEh1.Columns[7].Footer.SumValue); xlSheet.Range[Format('C%d:F%0:d', [iNextRow])].HorizontalAlignment := 7; xlSheet.Range[Format('A%d:F%0:d', [iNextRow])].Font.Bold := true; end; //根据类别输出数据到Excel procedure ExportData(DataType: Byte); begin SQLCmd := Format('where DataType=%d ', [DataType]); ADOQExport.SQL.Strings[4] := SQLCmd; if ADOQExport.Active then ADOQExport.Requery else ADOQExport.Open; ProgressBar1.StepIt; if not ADOQExport.IsEmpty then begin //标题 xlSheet.Range[Format('A%d', [iNextRow])].Value := DM.GetDataTypeStr(DataType);//将DataType转换为相应的文字显示 xlSheet.Range[Format('A%d:F%0:d', [iNextRow])].HorizontalAlignment := 7; xlSheet.Range[Format('A%d:F%0:d', [iNextRow])].Font.Bold := true; Inc(iNextRow); xlQuery := xlSheet.QueryTables.Add(ADOQExport.Recordset ,xlSheet.Range[Format('A%d', [iNextRow])]); xlQuery.FieldNames := false; xlQuery.Refresh; Inc(iNextRow, ADOQExport.RecordCount); xlSheet.Range[Format('A%d', [iNextRow])].Value := DM.GetDataTypeStr(DataType) + '合计(条)'; xlSheet.Range[Format('A%d:B%0:d', [iNextRow])].HorizontalAlignment := 7; xlSheet.Range[Format('C%d', [iNextRow])].Value := Format('=SUM(C%d:C%d)', [iNextRow-ADOQExport.RecordCount, iNextRow-1]); xlSheet.Range[Format('D%d', [iNextRow])].Value := Format('=SUM(D%d:D%d)', [iNextRow-ADOQExport.RecordCount, iNextRow-1]); xlSheet.Range[Format('A%d:F%0:d', [iNextRow])].Font.Bold := true; Inc(iNextRow); end; ProgressBar1.StepIt; end; begin Result := true; ShowProgress(0, cbbDataType.KeyItems.Count*2+2, 0); //调用前面例子中的函数显示进度面板 Screen.Cursor := crHourGlass; try try //建立OLE对象 xlApp := CreateOleObject('Excel.Application'); xlBook := xlApp.Workbooks.Add; xlSheet := xlBook.Worksheets['sheet1']; xlApp.Visible := false; ProgressBar1.StepIt; //设置格式 ExcelSetDefaultFormat; //输出标题内容 ExcelSetHeader; ProgressBar1.StepIt; //查询结果,导到EXCEL for i:=0 to cbbDataType.KeyItems.Count-1 do //cbbDataType: TDBComboBoxEh ExportData(StrToInt(cbbDataType.KeyItems.Strings[i])); //输出汇总内容 ExcelSetSum; //设置边框 xlSheet.Range[Format('A4:F%d', [iNextRow])].Borders.LineStyle := xlContinuous; xlSheet.Cells.EntireColumn.AutoFit; //输出页脚 ExcelSetFooter; except if not VarIsNull(xlApp) then begin xlApp.Quit; xlApp.Disconnect; xlApp := Unassigned; xlApp := NULL; end; result := false; Exit; end; finally pnlShadow.Visible := false; pnlProgress.Visible := false; Screen.Cursor := crDefault; xlSheet := Unassigned; xlBook := Unassigned; if not VarIsNull(xlApp) then begin xlApp.Visible := true; xlApp := Unassigned; end; if ADOQExport.Active then ADOQExport.Close; end; end; (2)快速导出数据到Excel(一):利用剪贴板 -------------------------------------------------------------------------------- 去Baidu(百度)搜索┊去Yisou(一搜)搜索┊去Google搜索┊ -------------------------------------------------------------------------------- 将数据导出到Excel的方法有多种,速度有快慢之分,我用过三种方法,速度都比较快,下面的一种是通过剪贴板进行,不过在个别W2K以上的系统,由于字符集编码不同,中文内容导出到Excel后可能变成乱码。 //显示进度条面板 procedure ShowProgress(Min, Max, Position: integer); begin pnlProgress.Left := (ClientWidth - pnlProgress.Width) div 2; ProgressBar1.Min := Min; ProgressBar1.Max := Max; ProgressBar1.Position := Position; pnlProgress.Visible := true; pnlProgress.Update; end; //将数据库数据添加到DataList function GetDataList(DataList: TStringList): Boolean; var S: string; i: integer; begin Result := true; DataList.Clear; try try DataList.Add('这是标题'); ProgressBar1.StepIt; ADOQuery1.DisableControls; with ADOQuery1 do begin First; S := ''; for i:=0 to FieldCount-1 do if Fields[i].Visible then S := S + Fields[i].DisplayLabel + #9; //先导出字段名,用制表符分开 DataList.Add(S); ProgressBar1.StepIt; While Not Eof do begin S := ''; for i:=0 to FieldCount-1 do if Fields[i].Visible then S := S + Fields[i].DisplayText + #9;//导出数据显示内容 DataList.Add(S); ProgressBar1.StepIt; Application.ProcessMessages; Next; end; end; except Result := false; end; finally ADOQuery1.EnableControls; end; end; function ExportByClipboard: Boolean; var List: TStringList; FileName: string; ASheet: Variant; begin ShowProgress(0, ADOQuery1.RecordCount+3, 0); Result := true; FileName := 'C:\abc.xls'; Excel.Connect; //Excel: TExcelApplication控件 try try Excel.DisplayAlerts[0] := false; Excel.Visible[0] := false; Excel.Caption := 'XXXXX导出(Excel)'; Excel.Workbooks.Add(xlWBATWorksheet, 0); ASheet := Excel.Worksheets.Item[1]; //设定默认格式 Excel.Cells.Font.Name := '宋体'; Excel.Cells.Font.Size := 10; Excel.Cells.VerticalAlignment := 2; //设定标题格式 Excel.Range['A1', 'Z1'].HorizontalAlignment := 7; Excel.Range['A1', 'Z1'].Font.Size := 16; Excel.Range['A1', 'Z1'].RowHeight := 22; Excel.Range['A2', 'Z2'].HorizontalAlignment := 3; Excel.Range['A2', 'Z2'].Font.Bold := true; List := TStringList.Create; try try if GetDataList(List) then begin //锁定计算机并将数据粘到Excel里 BlockInput(true); Clipboard.AsText := List.Text; ASheet.Paste; Clipboard.Clear; BlockInput(false); ProgressBar1.StepIt; end; finally List.Free; end; except Result := false; pnlProgress.Visible := false; Exit; end; ProgressBar1.StepIt; Excel.Workbooks.Item[1].SaveCopyAs(FileName, 0); Excel.Workbooks.Item[1].Close(false, FileName, 0, 0); finally Excel.Quit; Excel.Disconnect; end; except Result := false; pnlProgress.Visible := false; Exit; end; ProgressBar1.Position := ProgressBar1.Max; MessageBox(Handle, PChar('数据成功导出到' + FileName), '导出数据', MB_ICONINFORMATION or MB_OK); pnlProgress.Visible := false; end; |
B1层 发表时间: 05-10-03 11:09 |
![]() | 回复: zxdlovedjw [zxdlovedjw] ![]() |
登录 |
用DEPHI太麻烦了 用PB就可以搞定了 |
B2层 发表时间: 05-11-11 17:59 |
|
20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon
粤ICP备05087286号