做一般的报表,先根据客户的要求做成EXCEL模板,固定好行距、边距、行数等,用批注标识字段,好象很难的!

解决方案 »

  1.   

    用Ado 聯接, 然後就是操作數據庫的問題了!!
      

  2.   

    不难,我以前实现过,呵呵,如果你用标注的话,记得要把标注给删了,否则excel一片红,而且文件比较大。我可以发给你例子,不知道你qq或者msn是多少啊?
      

  3.   

    TO:blackbeetle(票房毒药)
    碰上大好人了!
    再次感谢!
      

  4.   

    不难,我以前实现过!!你先在excel中建好一个宏,把宏代码拷到delphi中修改一点点就可以了!
      

  5.   

    ////////////////////////////////////////////////////////////////////////////////
    //函数名 :  DBToExcel
    //
    //  功能 : 将TDBGrid 的数据导入到从某模板文件建立的 Excel 文档中,
    //  举例 :  DBToExcel( 'C:\ReportTable.Xlt', 'C:\ReportTable.Xls',
    //                       DBGrid1, 5, 1 ) ;                                    //
    //  注意  :所指定的模板文件*.xlt, 必须已存在
    ////////////////////////////////////////////////////////////////////////////////
    Procedure Tfrm_bbsc.DBToExcel
    ( ModuleName : String ;  // Excel 模块文件名 *.Xlt
      FileName: String ;  // Excel 目标文件名 *.Xls
      DBGrid : TDBGrid ;  // TDBGrid 控件名
      dataRow : Integer ;  //数据起始行
      dataCol : Integer; // 数据起始列
      startcol:string; //表格起始列
      endcol:string //表格结束列
    );
    var
          i,j:integer;
          s,bbtitle1,bbtitle2:string;
          var ExcelApp,MyWorkbook:oleVariant;
    begin
      //得到报表标题字
     try
     dbgrid.DataSource.DataSet.DisableControls;
       if (inttostr(datarow)='') or (inttostr(datacol)='') or (startcol='') or (endcol='') then
       begin
        application.MessageBox(pchar('excel模版数据有错请在报表编码中维护!'),'系统提示:',0+64);
        exit;
       end;
       if rd_yb.Checked then
       begin
        bbtitle1:=gettitlte(trim(copy(filename,1,4)),trim(copy(filename,5,2)),copy(filename,7,length(filename)-6));
        if trim(ado_scdata['shr'])='' then  bbtitle2:='制表:'+trim(frm_main.StatusBar1.Panels[1].Text)+'  审核:'+'未审核'+'  制表日期:'+formatdatetime('yyyy"年"mm"月"dd"日"', date)
        else
         bbtitle2:='制表:'+trim(frm_main.StatusBar1.Panels[1].Text)+'  审核:'+trim(ado_scdata['shr'])+'  制表日期:'+formatdatetime('yyyy"年"mm"月"dd"日"', date);
       end;
       if rd_nb.Checked then
       begin
        bbtitle1:=gettitlte(trim(copy(filename,1,4)),'',copy(filename,5,length(filename)-4));
        if trim(ado_scdata['shr'])='' then  bbtitle2:='制表: '+trim(frm_main.StatusBar1.Panels[1].Text)+'  审核:'+'未审核'+'  制表日期:'+formatdatetime('yyyy"年"mm"月"dd"日"', date)
        else
        bbtitle2:='制表: '+trim(frm_main.StatusBar1.Panels[1].Text)+'  审核:'+trim(ado_scdata['shr'])+'  制表日期:'+formatdatetime('yyyy"年"mm"月"dd"日"', date);
       end;
       try
          ExcelApp:=CreateOleObject('Excel.Application');
          MyWorkBook:=CreateOleobject('Excel.Sheet');
        except
          on Exception do raise exception.Create('无法运行EXCEL!请确认已安装!')
        end;
        ModuleName := Trim(extractfilepath(application.ExeName)+'excel模版\'+ModuleName+'.xlt');
        If FileExists(ModuleName)= False Then
        begin
           ShowMessage( '模板文件: '+ ModuleName + ' 不存在 !' ) ;
           Exit ;
        end ;
        //增加一个工作表
        MyworkBook:=ExcelApp.WorkBooks.add(trim(ModuleName));
        //字体颜色
        {Myworkbook.worksheets[1].Range['A1:k1'].Font.Color := clBlue;
        //字体
        Myworkbook.worksheets[1].Range['A1:H3'].Font.Name := '隶书';
        //字号
        Myworkbook.worksheets[1].Range['A1:H1'].Font.Size := 22;
        Myworkbook.worksheets[1].Range['A2:H2'].Font.Size :=18;
        Myworkbook.worksheets[1].Range['A3:H3'].Font.Size :=14; }
        MyWorkBook.WorkSheets[1].Cells[1,1].value:=bbtitle1;
        MyWorkBook.WorkSheets[1].Cells[2,1].value:=bbtitle2;
        // 把 TDBGrid 的数据导入Excel 中
          DBGrid.DataSource.DataSet.First ;
          i := dataRow ;
          While Not(DBGrid.DataSource.DataSet.Eof)  Do
          Begin
              For j:=datacol To DBGrid.FieldCount-datacol  Do
              begin
                  if DBGrid.Fields[j].DataType<>ftString then
                  begin
                    if (DBGrid.Fields[j].Value=0) or (DBGrid.Fields[j].Value=null) then
                     MyWorkBook.WorkSheets[1].Cells[i,j].Value :=''
                    else
                     MyWorkBook.WorkSheets[1].Cells[i,j].Value :=trim(DBGrid.Fields[j].AsString);
                  end
                  else
                  MyWorkBook.WorkSheets[1].Cells.Item[i,j]:=trim(DBGrid.Fields[j].AsString);
              end;
          DBGrid.DataSource.DataSet.Next ;
          i := i+1 ;
          End;
        //设置列宽
        s:='A1:F'+inttostr(dbgrid.DataSource.DataSet.RecordCount);
        Myworkbook.worksheets[1].Range[s].Font.Name := '仿宋';
        //划表线
        s := trim(startcol)+inttostr(datarow)+':'+trim(endcol)+IntToStr(dbgrid.DataSource.DataSet.RecordCount+datarow-1);
        Myworkbook.worksheets[1].Range[s].Borders.LineStyle := 1;
        //设置页面
        //MyworkBook.WorkSheets[1].PageSetup.CenterFooter := '第&P页';
        MyworkBook.WorkSheets[1].PageSetup.CenterHorizontally := 2/0.035;//true;
        MyworkBook.WorkSheets[1].PageSetup.PaperSize := $9;
        // 保存到指定的文件
        FileName := Trim(extractfilepath(application.ExeName)+'excel生成报表\'+FileName+'.xls');
        IF FileExists(FileName) Then DeleteFile(FileName) ;
        MyworkBook.SaveAs(FileName);
        ExcelApp.WorkBooks.open(Filename);
        ExcelApp.Visible := true;
    finally
       dbgrid.DataSource.DataSet.EnableControls;
    end;
    end;
      

  6.   

    打开word:
    var wrd=new ActiveXObject("Word.Application") 
    加载模板:  
    wrd.Documents.Open("D:\\QianZY\\Document\\外贸\\单证模版\\汇票.dot")
    得到书签:
    var bm=wrd.ActiveDocument.Books
    在特定书签处填入数据:
    bm.Item("openingdate").Range.Text="<%=strTemp%>"
    得到表格:
    var ContractTable=wrd.ActiveDocument.tables(1)
    在表格中填入数据:
    ContractTable.Rows(1).Cells.Item(9).Range.InsertAfter("总体积 TOTAL MEANS (CBM)")
    在表格中插入一行:
    var newRow = ContractTable.Rows.Add(ContractTable.Rows(2))
    在行中填入数据:
    newRow.Cells.Item(1).Range.InsertAfter("<%=arrDetail[i][0]%>")
    得到行数:
    ContractTable.Rows.Count
      

  7.   

    ExcelApp.WorkBooks.add('模版文件名',0)就可以打开了。‘模版文件名'要绝对路径