zoukankan      html  css  js  c++  java
  • Delphi TXLSReadWriteII导出Excel

    2011-08-04 9:50

    TXLSReadWriteII导出Excle (有点复杂,可以自己简化一下,直接从项目中抓取的)

    procedure TformSubReport.DataToExcel(_Item: Integer; _Obj: TObject);                         //导出Excle

    var

      i, j, k: Integer;

      aVendorObj: TVendor;

      aEnterpriseObj: TEnterprise;

      aXlsObj: TXLSReadWriteII;

      aFileName: AnsiString;

      aCarRec: PCarRec;

      aOnLine: AnsiString;

      aRecordCount: Integer;                                                       //Excel数据条数

      aEnterpriseCount: Integer;                                                   //统计企业有多少行 + 合计一行

      aBookmark: Integer;                                                          //记录运营商的起始位置

      aMergedCell: TMergedCell;

      aFontIndex: Integer;

      aStampTime: AnsiString;

      aVendorName: AnsiString;

    begin

      if _Item = 1 then

        _Obj := nil;

      aRecordCount := 0;

      aEnterpriseCount := 0;

      SaveDialog1.InitialDir := ExtractFilePath(ParamStr(0));

      SaveDialog1.DefaultExt := 'xls';

      SaveDialog1.Filter := 'Excel文件(*.xls)|*.xls|所有文件(*.*)|*.*';

      aStampTime := FormatDateTime('yyyymmddhhnnss', Now);

      SaveDialog1.FileName := aStampTime;

      if not SaveDialog1.Execute then

        Exit;

      aFileName := SaveDialog1.FileName;

      if aFileName = '' then

        Exit;

      aXlsObj := TXLSReadWriteII.Create(nil);

      try

        aXlsObj.Sheets[0].NameWideString('统计报表' + aStampTime);                 //工作表命名

        with aXlsObj.Formats.Add do                                                //定义格式一

        begin

          aFontIndex := aXlsObj.Fonts.AddIndex;

          aXlsObj.Fonts[aFontIndex].Name := '黑体';

          aXlsObj.Fonts[aFontIndex].Size := 14;

          aXlsObj.Fonts[aFontIndex].Color := xcRed;                                //字体颜色无效。shit

          HorizAlignment := chaCenter;

          VertAlignment := cvaCenter;

          FillPatternForeColor := xcLilac;

        end;

        with aXlsObj.Formats.Add do                                                //定义格式二

        begin

          HorizAlignment := chaCenter;

          VertAlignment := cvaCenter;

        end;

        case _item of

          1:begin

              aXlsObj.Sheets[0].WriteWideString(0, 0, 1, '运营商名称');

              aXlsObj.Sheets[0].WriteWideString(1, 0, 1, '企业名称');

              aXlsObj.Sheets[0].WriteWideString(2, 0, 1, '轨迹数总数');

              aXlsObj.Sheets[0].WriteWideString(3, 0, 1, '超速报警总数');

              aXlsObj.Sheets[0].WriteWideString(4, 0, 1, '车辆总数');

              aXlsObj.Sheets[0].WriteWideString(5, 0, 1, '在线车辆总数');

              aXlsObj.Sheets[0].WriteWideString(6, 0, 1, '在线率(%)');

            end;

        else

          begin

            aXlsObj.Sheets[0].WriteWideString(0, 0, 1, '序号');

            aXlsObj.Sheets[0].WriteWideString(1, 0, 1, '运营商名称');

            aXlsObj.Sheets[0].WriteWideString(2, 0, 1, '企业名称');

            aXlsObj.Sheets[0].WriteWideString(3, 0, 1, '定位时间');

            aXlsObj.Sheets[0].WriteWideString(4, 0, 1, '车牌号码');

            aXlsObj.Sheets[0].WriteWideString(5, 0, 1, '轨迹数');

            aXlsObj.Sheets[0].WriteWideString(6, 0, 1, '超速报警数');

            aXlsObj.Sheets[0].WriteWideString(7, 0, 1, '疲劳驾驶报警数');

            aXlsObj.Sheets[0].WriteWideString(8, 0, 1, '是否在线');

          end;

        end;

        if _Obj = nil then

        begin

          for i := 0 to FVendorHash.Count - 1 do

          begin

            aVendorObj := FVendorHash[i];

            if aVendorObj = nil then Continue;

            aBookmark := aEnterpriseCount;

            aEnterpriseCount := 0;

            for j := 0 to aVendorObj.EnterpriseHash.Count - 1 do

            begin

              aEnterpriseObj := aVendorObj.EnterpriseHash[j];

              if aEnterpriseObj = nil then Continue;

              if _Item = 1 then

              begin

                inc(aRecordCount);

                inc(aEnterpriseCount);

                aXlsObj.Sheets[0].WriteWideString(0, aRecordCount, 2, aVendorObj.DataRec.VendorName);

                aXlsObj.Sheets[0].AsWideString[1, aRecordCount] := aEnterpriseObj.DataRec.EnterpriseName;

                aXlsObj.Sheets[0].AsFloat[2, aRecordCount] := aEnterpriseObj.TotalInfo.TotalGpsCount;

                aXlsObj.Sheets[0].AsFloat[3, aRecordCount] := aEnterpriseObj.TotalInfo.TotalOverAlarm;

                aXlsObj.Sheets[0].AsFloat[4, aRecordCount] := aEnterpriseObj.TotalInfo.TotalCarCount;

                aXlsObj.Sheets[0].AsFloat[5, aRecordCount] := aEnterpriseObj.TotalInfo.TotalOnLine;

                aXlsObj.Sheets[0].AsFloat[6, aRecordCount] := aEnterpriseObj.TotalInfo.OnlineRate;

              end

              else

              begin

                for k := 0 to aEnterpriseObj.CarHash.Count - 1 do

                begin

                  aCarRec := aEnterpriseObj.CarHash[k];

                  if _Item = 2 then //在线

                  begin

                    if not aCarRec.IsLine then Continue;

                    aOnLine := '在线';

                  end

                  else if _Item = 3 then //离线

                  begin

                    if aCarRec.IsLine then Continue;

                    aOnLine := '离线';

                  end

                  else if _Item = 4 then //所有

                  begin

                    if aCarRec.IsLine then

                      aOnLine := '在线'

                    else

                      aOnLine := '离线';

                  end;

                  inc(aRecordCount);

                  inc(aEnterpriseCount);

                  aXlsObj.Sheets[0].AsInteger[0, aRecordCount] := aRecordCount;

                  aXlsObj.Sheets[0].AsWideString[1, aRecordCount] := aVendorObj.DataRec.VendorName;

                  aXlsObj.Sheets[0].AsWideString[2, aRecordCount] := aEnterpriseObj.DataRec.EnterpriseName;

                  aXlsObj.Sheets[0].AsWideString[3, aRecordCount] := DateTimeToStr(aCarRec.ReportDate);

                  aXlsObj.Sheets[0].AsWideString[4, aRecordCount] := aCarRec.RegistrationNO;

                  aXlsObj.Sheets[0].AsFloat[5, aRecordCount] := aCarRec.GpsCount;

                  aXlsObj.Sheets[0].AsFloat[6, aRecordCount] := aCarRec.OverSpeedAlarmCount;

                  aXlsObj.Sheets[0].AsFloat[7, aRecordCount] := aCarRec.DriverFatigueAlarmCount;

                  aXlsObj.Sheets[0].AsWideString[8, aRecordCount] := aOnLine;

                end;

              end;

            end;

            if _Item = 1 then                                   //小计

            begin

              Inc(aRecordCount);

              Inc(aEnterpriseCount);

              aXlsObj.Sheets[0].WriteWideString(0, aRecordCount, 2, aVendorObj.DataRec.VendorName);

              aXlsObj.Sheets[0].WriteWideString(1, aRecordCount, 2, '小计');

              aXlsObj.Sheets[0].AsFloat[2, aRecordCount] := aVendorObj.TotalInfo.TotalGpsCount;

              aXlsObj.Sheets[0].AsFloat[3, aRecordCount] := aVendorObj.TotalInfo.TotalOverAlarm;

              aXlsObj.Sheets[0].AsFloat[4, aRecordCount] := aVendorObj.TotalInfo.TotalCarCount;

              aXlsObj.Sheets[0].AsFloat[5, aRecordCount] := aVendorObj.TotalInfo.TotalOnLine;

              aXlsObj.Sheets[0].AsFloat[6, aRecordCount] := aVendorObj.TotalInfo.OnlineRate;

              aMergedCell := aXlsObj.Sheets[0].MergedCells.Add;

              aMergedCell.Col1 := 0;

              aMergedCell.Row1 := aBookmark + 1;

              aMergedCell.Col2 := 0;

              aMergedCell.Row2 := aBookmark + aEnterpriseCount;                    //这里的值是对应Excel中最后一行的地址

            end;

          end;

        end

        else if _Obj is TVendor then

        begin

          for j := 0 to TVendor(_Obj).EnterpriseHash.Count - 1 do

          begin

            aEnterpriseObj := TVendor(_Obj).EnterpriseHash[j];

            if aEnterpriseObj = nil then Continue;

            for k := 0 to aEnterpriseObj.CarHash.Count - 1 do

            begin

              aCarRec := aEnterpriseObj.CarHash[k];

              if _Item = 2 then //在线

              begin

                if not aCarRec.IsLine then Continue;

                aOnLine := '在线';

              end

              else if _Item = 3 then //离线

              begin

                if aCarRec.IsLine then Continue;

                aOnLine := '离线';

              end

              else if _Item = 4 then //所有

              begin

                if aCarRec.IsLine then

                  aOnLine := '在线'

                else

                  aOnLine := '离线';

              end;

              inc(aRecordCount);

              aXlsObj.Sheets[0].AsInteger[0, aRecordCount] := aRecordCount;

              aXlsObj.Sheets[0].AsWideString[1, aRecordCount] := TVendor(_Obj).DataRec.VendorName;

              aXlsObj.Sheets[0].AsWideString[2, aRecordCount] := aEnterpriseObj.DataRec.EnterpriseName;

              aXlsObj.Sheets[0].AsWideString[3, aRecordCount] := DateTimeToStr(aCarRec.ReportDate);

              aXlsObj.Sheets[0].AsWideString[4, aRecordCount] := aCarRec.RegistrationNO;

              aXlsObj.Sheets[0].AsFloat[5, aRecordCount] := aCarRec.GpsCount;

              aXlsObj.Sheets[0].AsFloat[6, aRecordCount] := aCarRec.OverSpeedAlarmCount;

              aXlsObj.Sheets[0].AsFloat[7, aRecordCount] := aCarRec.DriverFatigueAlarmCount;

              aXlsObj.Sheets[0].AsWideString[8, aRecordCount] := aOnLine;

            end;

          end;

        end

        else if _Obj is TEnterprise then

        begin

          aVendorObj := FVendorHash.ValueOf(IntToStr(TEnterprise(_Obj).DataRec.VendorID));

          if aVendorObj = nil then

            Exit;

          aVendorName := aVendorObj.DataRec.VendorName;

          for k := 0 to TEnterprise(_Obj).CarHash.Count - 1 do

          begin

            aCarRec := TEnterprise(_Obj).CarHash[k];

            if _Item = 2 then                         //在线

            begin

              if not aCarRec.IsLine then Continue;

              aOnLine := '在线';

            end

            else if _Item = 3 then                    //离线

            begin

              if aCarRec.IsLine then Continue;

              aOnLine := '离线';

            end

            else if _Item = 4 then                    //所有

            begin

              if aCarRec.IsLine then

                aOnLine := '在线'

              else

                aOnLine := '离线';

            end;

            inc(aRecordCount);

            aXlsObj.Sheets[0].AsInteger[0, aRecordCount] := aRecordCount;

            aXlsObj.Sheets[0].AsWideString[1, aRecordCount] := aVendorName;

            aXlsObj.Sheets[0].AsWideString[2, aRecordCount] := TEnterprise(_Obj).DataRec.EnterpriseName;

            aXlsObj.Sheets[0].AsWideString[3, aRecordCount] := DateTimeToStr(aCarRec.ReportDate);

            aXlsObj.Sheets[0].AsWideString[4, aRecordCount] := aCarRec.RegistrationNO;

            aXlsObj.Sheets[0].AsFloat[5, aRecordCount] := aCarRec.GpsCount;

            aXlsObj.Sheets[0].AsFloat[6, aRecordCount] := aCarRec.OverSpeedAlarmCount;

            aXlsObj.Sheets[0].AsFloat[7, aRecordCount] := aCarRec.DriverFatigueAlarmCount;

            aXlsObj.Sheets[0].AsWideString[8, aRecordCount] := aOnLine;

          end;

        end;

        if (_Item = 1) and (_Obj = nil) then                                       //汇总

        begin

          Inc(aRecordCount);

          aXlsObj.Sheets[0].WriteWideString(0, aRecordCount, 2, '汇总');

          aXlsObj.Sheets[0].AsInteger[1, aRecordCount] := FTotalEnterpriseCount;

          aXlsObj.Sheets[0].AsFloat[2, aRecordCount] := FTotalInfo.TotalGpsCount;

          aXlsObj.Sheets[0].AsFloat[3, aRecordCount] := FTotalInfo.TotalOverAlarm;

          aXlsObj.Sheets[0].AsFloat[4, aRecordCount] := FTotalInfo.TotalCarCount;

          aXlsObj.Sheets[0].AsFloat[5, aRecordCount] := FTotalInfo.TotalOnLine;

          aXlsObj.Sheets[0].AsFloat[6, aRecordCount] := FTotalInfo.OnlineRate;

        end;

        aXlsObj.Filename := aFileName;

        aXlsObj.Write;

        Information(Format('导出文件'+#13#10+'%s'+#13#10 +'成功!', [aFileName]));

      finally

        aXlsObj.Free;

      end;

    end;

  • 相关阅读:
    cocos2D-X 4.0 build
    Boost Download
    史上最全的CSS hack
    web前端js中ES6的规范写法
    爬虫最终杀手锏 --- PhantomJS 详解(附案例)
    移动端300ms延迟的解决方法
    js动态生成html元素并为元素追加属性
    css中border-sizing属性详解和应用
    纯CSS实现Tab切换
    阻止移动端浏览器点击图片会预览的几种方法
  • 原文地址:https://www.cnblogs.com/zhangzhifeng/p/2547250.html
Copyright © 2011-2022 走看看