网站上有很多关于如何根据条件给相关单元填充颜色,却很少有关于如何获取该单元格颜色的方法。
我现在在做一个转出excel的模块,转出的格式没有问题,但是却无法将dbgrid中的颜色转出到excel,
希望哪位大侠予以帮助,或提供思路。谢谢

解决方案 »

  1.   

    汗,也是噢....在DBGRID中,是不停的画.如果要取出,一手工对应,导出时自己对一下色彩.二,把要导出的那一行那一格,剪个图,然后取图中的某一点例:(0,10),得到点的RGB然后把RGB转成COLOR给EXCEL导出.呵呵,愚见!
      

  2.   

    nbzip,感谢回复,手工对应那是不可能的,呵呵,因为dbgrid中的单元格颜色是根据数据库的数据判断的,是动态的。
    二,类似的,我曾想过在DrawColumnCell事件中,通过二维数组模式,在单元格填充颜色的时候就将颜色赋值给数组,然后再再转出excel时,将对应二维数组的值赋予到excel对应cell中,但是这个在画dbgrid的时候,貌似无限循环了。
      

  3.   

    单元格颜色是在DrawColumnCell事件中填充的,知道怎么取数值DBGridEh.Columns.Items[iCount-1].Field.AsInteger,但不知道如何取其中的颜色呢,还请指点,最好有实现的代码啦,能实现的马上给分。procedure TForm2.DBGridEh4DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumnEh; State: TGridDrawState);
    if column.Field.AsInteger>=1 then
    begin      
          dbgrideh4.Canvas.Brush.Color:=cllime;
          dbgrideh4.Canvas.Font.Color:=cllime;        
          dbgrideh4.DefaultDrawColumnCell(Rect, DataCol, Column, State);
    end;
      

  4.   

    BINBIN,你要转一下想法.手工对应,并不是叫你叫你一个格一个格自己去对应色彩.  你在DBGIRD能对应一次颜色,为什么在EXCEL就不能对应了呢.
    在DrawColumnCell是无限,但问题他只是在表内数据发生变化后,进行重画.(实质上在同一时间,你就是手工对应一次表格颜色.)那么在EXCEL导出的时候,你就从头遍列一边,然后把导出这个时间(意思就是数据不变)的表的颜色给EXCEL画上去.
    能理解吗?我的第二个方法,呵呵,是叫你.在每一次导EXCEL的时候,(噢,就是数据内容不变的时候),把数据每个格剪一个图片,然后把图片中
    不会写到字的点,取出这个点的色彩,转成颜色.(DBGRID好像比较难得到这个格,呵呵,我可能想错了,这第二个方法,在DBGRID中好像
    比第一种还难,在DBGRID中CEIL值好像让DBGRID给私有了.在STRINGGRID中就能得到每个格的RECT.)第一种方法,我想应该能实现.
      

  5.   

    下面代码是我的测试,是可以达到你的目的:取得每个格子的颜色  private
        { Private declarations }
        Fcolor : TColor;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.DBGrid1ColEnter(Sender: TObject);
    begin
      Fcolor := TInplaceEdit(Sender).Brush.Color;//取得颜色
    end;procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
      Field: TField; State: TGridDrawState);
    begin
      if Field.FieldName='NAME' then
      begin
        TInplaceEdit(Sender).Brush.Color := clRed;//记录颜色
        DBGrid1.Canvas.Brush.Color := clRed;
        DBGrid1.Canvas.FillRect(Rect);
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);//执行导出
    begin
      Table1.First;
      dbgrid1.selectedindex:=-1;
      while not table1.eof do
      begin
        DBGrid1.SelectedIndex := 0;//触发colEnter
        Label1.Font.Color := Fcolor;//这里你可以指定execl格子的颜色
        next;
      end;;
    end;以上代码需要你自己再修改,应该可满足你的要求
      

  6.   

    要注意一点dbgrid的options中的alwaysSHowEditor若为false,那么在导出时procedure TForm1.Button1Click(Sender: TObject);//执行导出
    begin
      Table1.First;
      设定alwaysSHowEditor为true
      dbgrid1.selectedindex:=-1;
      while not table1.eof do
      begin
        DBGrid1.SelectedIndex := 0;//触发colEnter
        Label1.Font.Color := Fcolor;//这里你可以指定execl格子的颜色
        next;
      end;
      设定alwaysSHowEditor为false
    end;
      

  7.   

    请教Avan_Lau大侠,Label1.Font.Color := Fcolor如何让excel对应的cell与grid中的单元格一一对应呢?
    小弟菜鸟,大侠见笑了。
      

  8.   

    谢谢nbzip大侠,并不是很理解您的方法,但我已经实现了我想要的功能,很笨的方法,就是在转出excel的时候,如同DrawColumnCell一样再一次对显示的数据进行判断,然后再一一填充颜色。虽然解了燃眉之急,但通用性根本没有Avan_lan大侠的方法貌似不错,只是我不知道如何将excel中与dbgrid中的单元格一一对应,貌似二维数组的方法应该可以。感谢各位,今天下班前,我会记得结贴的,谢谢!
      

  9.   

    对应的话,要根据你的代码了,看你是如何将数据导出到excel的。
    我猜你是遍历dataset,可以这样,仅供参考,具体如何,自己再修改咯procedure TForm1.Button1Click(Sender: TObject);//执行导出
    var
      i: integer;
    begin
      Table1.First;
      设定alwaysSHowEditor为true
      dbgrid1.selectedindex:=-1;
      while not table1.eof do
      begin
        for i:=0 to table1.Fieldcount-1 do
        begin
          DBGrid1.SelectedIndex := i;//触发colEnter,取得颜色
          指定的excel.cell := Fields[i].value;
          指定的excel.cell color := FColor;//这里你可以指定excel格子的颜色   
         end;
        next;
      end;
      设定alwaysSHowEditor为false
    end;
      

  10.   

    excel单元格颜色设定,可设定Interior的color