Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.01;
Скачать: CL | DM;

Вниз

Окрасить строки в таблице   Найти похожие ветки 

 
Daria   (2005-12-13 12:10) [0]

Привет всем! :))
У меня есть табличка в Excel. Надо, чтобы она открывалась, если в последнем столбце значение отлично от 0, то строка должна окрашиваться в красный цвет. А как это сделать?


 
msguns ©   (2005-12-13 12:16) [1]

Даша, радость наша, здравствуй, родная !
Для решения твоей проблемы надо ознакомиться с такими объектами Эеселя:
- Ячейка (Cell) вместе со всеми своими свойствами (чтобы "прочитать" ее значение и цвет)
- Массив ячеек (Region) со свойствами (чтобы определить "последний" столбец и "последнюю" строку)


 
msguns ©   (2005-12-13 12:27) [2]

Может, это поможет:

unit XLReps;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics,
 ComObj, Excel2000, OleServer, DB, Variants;

type
 // Выравнивание текста внутри ячейки :
 CXLExp_HorAlignment = (ehaLeft,ehaRight,ehaCenter,ehaNone);   // горизонтальное
 CXLExp_VertAlignment = (evaTop,evaBottom,evaCenter,evaResize,evaMultiLine,evaNone);  // вертикальное
 // Толщина и наклон символов
 CXLExp_FontStyle = (efsBold, efsItalic, efsNone);
 SXLExp_FontStyle = set of CXLExp_FontStyle;
 CXLExp_BorderStyle = (ebsThin, ebsMedium, ebsThick, ebsBlank);
 RXLExp_Text = record
   Hor: CXLExp_HorAlignment;     // Горизонтальное
   Vert: CXLExp_VertAlignment;   // Вертикальное
   WrdWrap: boolean;             // Перенос по словам
 end;

 RXLExp_Font = record
   Name: TFontName;                 // Название шрифта (если "", то Default
   Color: TColor;                // Цвет шрифта
   Size: ShortInt;               // Размер шрифта (если AutoSize=true, игнорируется)
   Style: TFontStyles;           // Стиль (fsBold,fsItalic,fsUnderline,fsStrikeOut)
 end;

 RXLExp_CellsProp = record       // ******** Свойства ячеек
   Align: RXLExp_Text;           // Выравнивание текста внутри ячейки
   Font:  RXLExp_Font;           // Фонт
   Width: integer;               // Ширина ячейки в ед.Excel (если -1, то не уст-ся)
   Height: integer;              // Высота ячейки в ед.Excel (если -1, то не уст-ся)
   Value: OleVariant;            // Значение ячейки
   Color: TColor;                // Цвет фона
   // ВАЖНО ! При установке цвета фона следует учитывать, что палитра цветов
   // Excel`а существенно отличается от принятого в Windows, что может привести
   // к тому, что вместо светло-серого ячейки окрасятся в черный, т.к. полутона
   // екселем интерпретируются в полный, насыщенный цвет палитры RGB
 end;

 RXLExp_Region = record
   ColLeft: word;                // Колонка начала
   RowTop: word;                 // Строка начала
   ColRight: word;               // Колонка конца
   RowBottom: word;              // Строка конца
   JoinCells: boolean;           // Объединения ячеек (только для региона)
   Text: string;                 // Текст в ячейках
 end;

// Открывает Excel-объект
procedure XLExp_OpenReport(TemplateName: OleVariant);

// Закрывает Excel-объект
procedure XLExp_CloseReport;

// Устанавливает свойства ячеек в заданном районе
procedure XLExp_SetCellsProp(Region: RXLExp_Region; CellsProp: RXLExp_CellsProp);

// Возращает объект "Свойства" для указанного района ячеек
procedure XLEXP_GetCellsProp(Region: RXLExp_Region; var CellsProp: RXLExp_CellsProp);

// Задать ширину колонки
procedure XLExp_SetColumnWidth(Col,Width: integer);

// Слить ячейки в одну область
procedure XLExp_MergeCells(Region: RXLExp_Region);

// Запись в указанный район ячеек текста со слитием ячеек, выравниванием по центру
// и заданным размером и типом шрифта
procedure XLExp_CaptionInRange(Region: RXLExp_Region; Txt: string;
      FntSize: word; FntStyle: SXLExp_FontStyle; Mrg: boolean);

// Процедура обводит ячейки указанного района листа решеткой заданной ширины
procedure XLExp_DrowBorder(Region: RXLExp_Region; Brd: CXLExp_BorderStyle);

// Занести текст в указанную ячейку
function XLExp_SetDataInCell(Index1,Index2: OleVariant; Data: string):string;

procedure XLExp_DataSetExport(Range:OleVariant; DataSet:TDataSet);

function XLExp_ShowReport: boolean;

function XLExp_GetLastRow(Range:OleVariant; DataSet:TDataSet):integer;

var
 XLExp_Report: TExcelApplication;
 XLExp_WorkBook: Excel2000.ExcelWorkBook;
 XLExp_Sheet: Excel2000.ExcelWorkSheet;
 XLExp_Col: array [1..26] of string=("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z");

implementation

procedure XLExp_OpenReport(TemplateName: OleVariant);
// Процедура создает в первый раз Excel-приложение, а если оно уже существует,
// то коннектится к нему, определяя опции коннекта и создавая объекты "Книга"
// и "Лист". Имя книги задается параметром TemplateName
begin
 if not Assigned(XLExp_Report) then
    XLExp_Report:=TExcelApplication.Create(nil);
 XLExp_Report.ConnectKind:=ckRunningOrNew;
 XLExp_Report.Connect;
 XLExp_WorkBook:=XLExp_Report.Workbooks.Add(TemplateName,0);
 XLExp_Sheet:=XLExp_Workbook.Worksheets.Item[1] as Excel2000.ExcelWorkSheet;
end;

procedure XLExp_CloseReport;
// Процедура закрывет Excel-приложение и освобождает занятые им ресурсы
begin
 if Assigned(XLExp_Report) then
   begin
    XLExp_Sheet:=nil;
    XLExp_Workbook:=nil;
    FreeAndNil(XLExp_Report);
   end;
end;

procedure XLEXP_SetCellsProp(Region: RXLExp_Region; CellsProp: RXLExp_CellsProp);
// Присваивает ячейкам заданного района указанные свойства
begin
 with XLExp_Sheet.Range[XLExp_Col[Region.ColLeft]+IntToStr(Region.RowTop),
                   XLExp_Col[Region.ColRight]+IntToStr(Region.RowBottom)] do
   begin
    case CellsProp.Align.Hor of
      ehaLeft: HorizontalAlignment := xlLeft;
      ehaRight: HorizontalAlignment := xlRight;
      ehaCenter: HorizontalAlignment := xlCenter;
      ehaNone: HorizontalAlignment := xlDefaultAutoFormat;
    end;
    case CellsProp.Align.Vert of
      evaResize: VerticalAlignment := xlGeneral;
      evaMultiLine: VerticalAlignment := xlDistributed;
      evaTop: VerticalAlignment := xlTop;
      evaBottom: VerticalAlignment := xlBottom;
      evaCenter: VerticalAlignment := xlCenter;
      evaNone: VerticalAlignment := xlDefaultAutoFormat;
    end;
    WrapText := CellsProp.Align.WrdWrap;
    Font.Bold := fsBold in CellsProp.Font.Style;
    Font.Italic := fsItalic in CellsProp.Font.Style;
    Font.Strikethrough := fsStrikeOut in CellsProp.Font.Style;
    Font.Subscript := fsUnderline in CellsProp.Font.Style;
    Font.Color := CellsProp.Font.Color;
    Font.Size := CellsProp.Font.Size;
    if CellsProp.Font.Name>"" then Font.Name := CellsProp.Font.Name;
    Interior.Color := CellsProp.Color;
    if CellsProp.Width>-1 then Columns.ColumnWidth := CellsProp.Width;
    if CellsProp.Height>-1 then Rows.RowHeight := CellsProp.Height;
    MergeCells := Region.JoinCells;
    if Region.Text>"" then Value := Region.Text;
   end;
end;


 
msguns ©   (2005-12-13 12:54) [3]

Продолжение:

procedure XLEXP_GetCellsProp(Region: RXLExp_Region; var CellsProp: RXLExp_CellsProp);
// Возращает объект "Свойства" для указанного района ячеек
begin
 with XLExp_Sheet.Range[XLExp_Col[Region.ColLeft]+IntToStr(Region.RowTop),
                   XLExp_Col[Region.ColRight]+IntToStr(Region.RowBottom)] do
   begin
    CellsProp.Align.WrdWrap := WrapText;
    CellsProp.Font.Style := [];
    if Font.Bold then Include(CellsProp.Font.Style,fsBold);
    if Font.Italic then Include(CellsProp.Font.Style,fsItalic);
    if Font.Strikethrough then Include(CellsProp.Font.Style,fsStrikeOut);
    if Font.Subscript then Include(CellsProp.Font.Style,fsUnderline);
    CellsProp.Font.Color := Font.Color;
    CellsProp.Color := Interior.Color;
    if CellsProp.Width>-1 then Columns.ColumnWidth := CellsProp.Width;
    if CellsProp.Height>-1 then Rows.RowHeight := CellsProp.Height;
    Region.JoinCells := MergeCells;
   end;
end;

procedure XLExp_SetColumnWidth(Col,Width: integer);
// Изменить ширину колонки
begin
 XLExp_Sheet.Range[XLExp_Col[Col]+"1",XLExp_Col[Col]+"1"].ColumnWidth := Width;
end;

procedure XLExp_MergeCells(Region: RXLExp_Region);
// Слить ячейки
begin
 XLExp_Sheet.Range[XLExp_Col[Region.ColLeft]+IntToStr(Region.RowTop),
                   XLExp_Col[Region.ColRight]+IntToStr(Region.RowBottom)].MergeCells := true;
end;

procedure XLExp_CaptionInRange(Region: RXLExp_Region; Txt: string;
      FntSize: word; FntStyle: SXLExp_FontStyle; Mrg: boolean);
// Запись в указанный район ячеек текста со слитием ячеек, выравниванием по центру
// и заданным размером и типом шрифта
begin
 with XLExp_Sheet.Range[XLExp_Col[Region.ColLeft]+IntToStr(Region.RowTop),
                   XLExp_Col[Region.ColRight]+IntToStr(Region.RowBottom)] do
  begin
   if Mrg then MergeCells := true;
   Formula := Txt;
   HorizontalAlignment := xlCenter;
   VerticalAlignment := xlCenter;
   Font.Size := FntSize;
   Font.Bold := (efsBold in FntStyle);
   Font.Italic := (efsItalic in FntStyle);
  end;
end;

procedure XLExp_DrowBorder(Region: RXLExp_Region; Brd: CXLExp_BorderStyle);
// Процедура обводит указанный район листа рамкой заданного типа
begin
 with XLExp_Sheet.Range[XLExp_Col[Region.ColLeft]+IntToStr(Region.RowTop),
                   XLExp_Col[Region.ColRight]+IntToStr(Region.RowBottom)].Borders do
   begin
    LineStyle := xlContinuous;
    case Brd of
      ebsThin: Weight := xlThin;
      ebsMedium: Weight := xlMedium;
      ebsThick: Weight := xlThick;
    end;
   end;
end;

function XLExp_SetDataInCell(Index1,Index2: OleVariant; Data: string): string;
// Записывает заданный текст в указанную ячейку
begin
 XLExp_Report.ActiveWorkbook;     // Активировать текущую книгу
 // Лист книги, в котором править ячейку
 XLExp_Sheet := XLExp_Workbook.Worksheets.Item[1] as Excel2000.ExcelWorkSheet;
 // Присвоение ячейке заданного значения
 XLExp_Sheet.Cells.Item[Index1,Index2].Value := Data;
end;

procedure XLExp_DataSetExport(Range: OleVariant; DataSet: TDataSet);
// Експорт данных из датасета в Excel-лист
// Область листа (Range) задается параметром Range
// Range задает область листа (непрерывная последовательность ячеек листа)
//  начиная с которой будет итти заполнение из НД. При этом самой левой колонкой
//  может любая колонка листа, а строкой - любая строка листа.
// Ячейки этой "линии" колонок должны содержать имена полей НД, данные которых
//  будут помещаться в эти колонки
var
 RangeLen,Column,Row,lich,i,x: integer;
 ValueArray: OleVariant;
 Str: string;
 FieldArray: array [0..20] of string;
 bm: TBookmark;

begin
 // Строка начала района
 Row:=XLExp_Sheet.Range[Range,EmptyParam].Row;
 // Колонка начала района (левая крайняя)
 Column:=XLExp_Sheet.Range[Range,EmptyParam].Column;
 // Колонка конца района (правая крайняя)
 RangeLen:=Column+(XLExp_Sheet.Range[Range,EmptyParam].Columns.Count-1);
 // Переписать в массив FieldArray содержимое ячеек 1-й строки указанной области
 // листа Excel (имена полей датасета).
 // Предполагается, что их не должно быть более 21
 x := 0;
 for i := Column to RangeLen do
  begin
   Str := XLExp_Sheet.Cells.Item[Row,i].Formula;  // Содержимое ячейки
   Delete(Str,1,1);         // Обрезаем первый (служебный) символ
   FieldArray[x] := Str;
   x := x+1;
  end;
 // Создать дин.массив размерностью RxC, где R - кол-во строк датасета,
 // а C - кол-во колонок, заданное Range
 ValueArray := VarArrayCreate([0,DataSet.RecordCount-1,0,XLExp_Sheet.Range[Range,EmptyParam].Columns.Count],varVariant);
 lich := 0;    // Индекс строки НД
 // Подготовка датасета к сканированию
 with DataSet do
   begin
    bm := GetBookmark;     // Запомнить текущую запись
    DisableControls;
    First;
    while not Eof do
      begin
       for i := 0 to XLExp_Sheet.Range[Range,EmptyParam].Columns.Count do
         // Для каждой колонки Region определяется имя поля НД и значение
         //  этого поля записывается в дин.массив по адресу=индексу колонки
         begin
          if (FieldArray[i]<>"") then  // Колонка имеет ссылку на имя поля ?
              ValueArray[lich,i] := FieldByName(FieldArray[i]).AsString
          else
              ValueArray[lich,i] := "";
          end;
          lich := lich+1;
          Next;
      end;
    EnableControls;
    GotoBookmark(bm);   // Вернуться в исходную (до сканирования) запись
    FreeBookmark(bm);
   end;
{  Выражение :
   xlSheet.Range[Col[Column]+IntToStr(Row),Col[RangeLen]+IntToStr(Row+DataSet.RecordCount-1)]
  представляет "экселовскую" адресацию типа "A10","H17", где буква - индекс колонки, а
  число-индекс строки на листе Excel.
   В нативном виде (в самом Excel`е) этот регион будет = "A10:H17"
}
 // Перегнать в лист Excel (Ragion) значения из массива ValueArray
 XLExp_Sheet.Range[XLExp_Col[Column]+IntToStr(Row),XLExp_Col[RangeLen]+IntToStr(Row+DataSet.RecordCount-1)].Value := ValueArray;
 // Присвоить всем ячейкам региона Region цвет символов как у левой верхней ячейки
 XLExp_Sheet.Range[XLExp_Col[Column]+IntToStr(Row),XLExp_Col[RangeLen]+IntToStr(Row+DataSet.RecordCount-1)].Font.Color := XLExp_Sheet.Range[Range,EmptyParam].Font.Color;
 // Присвоить всем ячейкам региона Region цвет как у левой верхней ячейки
 XLExp_Sheet.Range[XLExp_Col[Column]+IntToStr(Row),XLExp_Col[RangeLen]+IntToStr(Row+DataSet.RecordCount-1)].Interior.Colo r := XLExp_Sheet.Range[Range,EmptyParam].Interior.Color;
 // Присвоить всем ячейкам региона Region рамки как у левой верхней ячейки
 XLExp_Sheet.Range[XLExp_Col[Column]+IntToStr(Row),XLExp_Col[RangeLen]+IntToStr(Row+DataSet.RecordCount-1)].Borders.LineS tyle := XLExp_Sheet.Range[Range,EmptyParam].Borders.LineStyle;
end;

end.


 
msguns ©   (2005-12-13 12:55) [4]

Окончание

function XLExp_ShowReport: boolean;
// Показать лист Excel`а для правки, сохранения и печати
begin
 result := false;
 if Assigned (XLExp_Report) then
   begin
    XLExp_Report.WindowState[0] := Excel2000.xlMaximized;
    XLExp_Report.Visible[0] := true;
    XLExp_Report.ScreenUpdating[0] := true;
    result := true;
   end;
end;

function XLExp_GetLastRow(Range: OleVariant; DataSet: TDataSet): integer;
// Возвращает индекс следующей за последней строкой (Row) листа,
// занятой (или которая будет занята после заливки данных из НД) данными.
// Начиная с этой строки можно располагать итоги или подвал документа
begin
 XLExp_GetLastRow:=XLExp_Sheet.Range[Range,EmptyParam].Row+DataSet.RecordCount;
end;


 
umbra ©   (2005-12-13 12:58) [5]

2 msguns ©   (13.12.05 12:55) [4]

на ближайшие две недели работы автору вопроса должно хватить :))


 
Daria   (2005-12-13 13:25) [6]

ой-ой-ой, а обязательно что-то там выравнивать?? и вообще, что-то слишком много за раз для меня.....
спасибо большое!!! попытаюсь разобраться.... видимо, до встречи в следующем году


 
msguns ©   (2005-12-13 13:29) [7]

Тогда до кучи:

// Содержит процедуры автовывода отображаемого в DBGrid` НД
//  в книгу Excel
unit XLRepGrid;

interface

uses
 Windows, Messages, SysUtils, Classes, ComObj, Excel2000, OleServer,
 DB, DBGrids, Variants, XLReps, Graphics;

procedure XLRep_ExportFromDBGrid(Grid: TDBGrid; RepCaption: string);

implementation

procedure XLRep_ExportFromDBGrid(Grid: TDBGrid; RepCaption: string);
// Выводятся только колонки с Visible=true и Field.Tag>0 (последнее для
// блокировки вывода "фантомных" колонок, где отображается не поле
// датасета, а, например, картинка
type
 // Описатель печатной колонки
 TXLRep_GridCol = ^RXLRep_GridCol;
 RXLRep_GridCol = record
   Title: string;
   FldName: string;
   FldNdx: Shortint;
   Width: integer;
   AgrSum: extended;
   AgrFlg: boolean;
   Alignment: TAlignment;
   Font: RXLExp_Font;
 end;

var
 i,r: integer;
 bm: TBookMark;
 GridRep: TList;
 pc: TXLRep_GridCol;
 rg: RXLExp_Region;
 cs: RXLExp_CellsProp;
 VA: OleVariant;

begin
 GridRep := TList.Create;
 // Анализ грида и связанного с ним датасета
 for i := 0 to Grid.Columns.Count-1 do
   if Grid.Columns[i].Visible and (Grid.Columns[i].Field.Tag>0) then
     begin
      NEW(pc);
      pc.Title := Grid.Columns[i].Title.Caption;
      pc.FldName := Grid.Columns[i].FieldName;
      pc.FldNdx := Grid.Columns[i].Field.Index;
      pc.Width := Grid.Columns[i].Width;
      pc.AgrSum := 0;
      pc.AgrFlg := (Grid.Columns[i].Field.Tag>1);
      pc.Alignment := Grid.Columns[i].Alignment;
      with pc.Font do
        begin
         Size := Grid.Columns[i].Font.Size;
         Name := Grid.Columns[i].Font.Name;
         Style := Grid.Columns[i].Font.Style;
        end;
      GridRep.Add(pc);
     end;
 // Подконнектиться к Экселю с открытием новой книги
 XLExp_OpenReport("");
 // Определяем ширину колонок в Excel как ширина колонки грида в пикселах,
 //  деленная на 8 (Эксель "меряет" ширину в кол-ве условных символов цифр
 //  фонта по умолчанию (Arrial Cyr, обычный, 10)
 for i := 0 to GridRep.Count-1 do
    XLExp_SetColumnWidth(i+1,TXLRep_GridCol(GridRep[i])^.Width div 8);
 // ************************  ЗАГОЛОВОК ОТЧЕТА ***************************
 with rg do
   begin
    ColLeft := 1; ColRight := GridRep.Count;    // Ширина на все колонки
    RowTop := 1; RowBottom := 1;                // 1-я строка листа под заголовок
    JoinCells := true;                          // Объединить ячейки
    Text := RepCaption;                         // Текст заголовка
   end;
 with cs do
   begin
    Align.Hor := ehaCenter; Align.Vert := evaMultiLine;  // Центровка по высоте и ширине
    Font.Size := 13; Font.Style := [fsBold,fsItalic]; // Шрифт крупный, жирный, наклонный
    Font.Color := clWindowText;                 // Черный цвет символов
    Color := clWhite;                           // Белый фон
    Width := -1;                                // Ширину колонок не менять
    Height := 42;                               // Высота строки двойная
   end;
 XLEXP_SetCellsProp(rg,cs);                     // Разметка ячеек и занесение текста


 
msguns ©   (2005-12-13 13:30) [8]

Окончание:

// ************************  ШАПКА ТАБЛИЦЫ ***************************
 // Вторую строку отводим под шапку таблицы, размечаем ячейки под
 // названия колонок
 // и помещаем туда название колонок из титула грида.
 with rg do
   begin
    RowTop := 2; RowBottom := 2;                // Вторая строка листа под шапку
    JoinCells := false; Text := "";             // Ячейки не объединять и не заполнять
   end;
 with cs do
   begin
    Align.Hor := ehaCenter; Align.Vert := evaMultiLine;  // Выравнивать по центру и с переносом слов
    Font.Size := 10; Font.Style := [fsBold];    // Шрифт чуть крупнее обычного и жирный
    Height := 28;                               // Высота строки двойная
   // Color := clSilver;                          // Серый фон шапки
   end;
 XLEXP_SetCellsProp(rg,cs);                     // Разметка ячеек
 XLExp_DrowBorder(rg,ebsMedium);                // Нанесение сетки
 // Занесение заголовков в шапку
 for i := 0 to GridRep.Count-1 do
    XLExp_SetDataInCell(rg.RowTop,i+1,TXLRep_GridCol(GridRep[i])^.Title);
 // *********** СОЗДАНИЕ МАССИВА И ЗАПОЛНЕНИЕ ЕГО ДАННЫМИ ДАТАСЕТА ************
 with Grid.DataSource.DataSet do
   begin
    bm := GetBookmark;         // Запомнить текущую запись
    DisableControls;           // Запрет отображения
    Last; First;               // Извлечь все записи с сервера
    r := 0;
    // Создать пустой массив вариантов
    VA := VarArrayCreate([0,RecordCount-1,0,GridRep.Count],varVariant);
    while not eof do
      begin
       inc(r);
       for i := 0 to GridRep.Count-1 do
         begin
          pc := TXLRep_GridCol(GridRep[i]);
          VA[RecNo-1,i] := FieldByName(pc.FldName).AsString;
          if pc.AgrFlg then pc.AgrSum := pc.AgrSum +FieldByName(pc.FldName).AsFloat;
         end;
       Next;
      end;
    GotoBookmark(bm);          // Вернуться в исходную запись
    FreeBookmark(bm);
    EnableControls;            // Разрешение отображения
   end;
 // Выставить свойства колонок таблицы аналогично колонкам грида
 for i :=0 to GridRep.Count-1 do
   begin
    with rg do
      begin
       ColLeft := i+1; ColRight := ColLeft;
       RowTop := 3; RowBottom := RowTop+r-1;
       JoinCells := false; Text := "";
      end;
    with cs do
      begin
       Font := TXLRep_GridCol(GridRep[i])^.Font;
       Font.Color := clWindowText;
       case TXLRep_GridCol(GridRep[i])^.Alignment of
         taLeftJustify: Align.Hor := ehaLeft;
         taRightJustify: Align.Hor := ehaRight;
         taCenter: Align.Hor := ehaCenter;
       end;
       Height := 13;
      end;
    XLEXP_SetCellsProp(rg,cs);
   end;
 with rg do
   begin
    ColLeft := 1; ColRight := GridRep.Count;
    RowTop := 3; RowBottom := RowTop+r-1;
   end;
 XLExp_DrowBorder(rg,ebsThin);     // Покрыть таблицу сеткой
 // Заполнение ячеек данными массива
 XLExp_Sheet.Range[XLExp_Col[rg.ColLeft]+IntToStr(rg.RowTop),
    XLExp_Col[rg.ColRight]+IntToStr(rg.RowBottom)].Value := VA;
 VarArrayRedim(VA,0);   // Убить массив
 // Создать массив итогов
 VA := VarArrayCreate([0,GridRep.Count-1],varVariant);
 // Записать в него итоги по колонкам
 for i := 0 to GridRep.Count-1 do
   if TXLRep_GridCol(GridRep[i])^.AgrFlg then
     VA[i] := FloatToStr(TXLRep_GridCol(GridRep[i])^.AgrSum)
   else
     VA[i] := "";
 // Разметить строку для итогов
 with rg do       // Выделяем строку, через одну от последней табличной.
   begin
    ColLeft := 1; ColRight := GridRep.Count;
    RowBottom := RowTop+r+1; RowTop := RowBottom;
   end;
 // Устанавливаем свойства ячеек, аналогично табличным колонкам
 XLEXP_SetCellsProp(rg,cs);
 // Заполнение ячеек итогов данными массива
 XLExp_Sheet.Range[XLExp_Col[rg.ColLeft]+IntToStr(rg.RowTop),
    XLExp_Col[rg.ColRight]+IntToStr(rg.RowBottom)].Value := VA;
 VarArrayRedim(VA,0);   // Убить массив
 // Вывестти отчет на просмотр
 XLExp_ShowReport;
end;

end.


 
Daria   (2005-12-13 13:43) [9]

так, стоп....
все это меня уже и так убило!
msguns, миленький, объясни по полочкам что куда мы там делаем? я не хочу ничего выравнивать, объясни только как читать из данные их excel


 
msguns ©   (2005-12-13 14:00) [10]

Прежде чем работать с экселем, тебе необходимо познакомиться с его объектами и понять зачем они нужны и что с ними можно делать.


 
alex_*** ©   (2005-12-13 14:00) [11]

На будущее: когда надо что-то с Ексель сделать, надо сначала запустить на запись макрос в нем, сделать что хочешь на тестовом промере, потом посмотреть текст макроса. Очень часто помогает


 
umbra ©   (2005-12-13 14:12) [12]

у объекта range есть свойство FormatConditions, которое в зависимости от содержимого ячеек в диапазоне форматирует их каким либо образом.
Чтобы ячейки в диапазоне А1:А10 были красными, если в них нули и зелеными если нет, можно сделать следующее:
var
 myrange, myformatcondition: variant;
{..........................}
 myrange := Worksheets[1].Range("a1:a10");
 myformatcondition := myrange.FormatConditions.Add(xlCellValue, xlEqual, "0");
 myformatconditions.Interior.Colorindex := 3;
 myformatcondition := myrange.FormatConditions.Add(xlCellValue, xlNotEqual, "0");
 myformatconditions.Interior.Colorindex := 10;
{..............................}


 
Daria   (2005-12-13 14:44) [13]

umbra, спасибо большое! с этим ясно. а вот как открыть файл excel и посмотреть последнии столбцы с 0?


 
umbra ©   (2005-12-13 15:03) [14]


> посмотреть последнии столбцы с 0?


не понял вопроса. последние столбцы где? на листе? и посмотреть что - нули в них или нет?


 
Daria   (2005-12-13 15:07) [15]

да. мне нужно в таблице окрасить строки, в последнем столбце которых 0. а вот как их найти-то?


 
Игорь Шевченко ©   (2005-12-13 15:18) [16]


> мне нужно в таблице окрасить строки, в последнем столбце
> которых 0


А номер последнего столбца секрет ?


 
Daria   (2005-12-13 15:19) [17]

у меня 11 столбцов


 
clickmaker ©   (2005-12-13 15:21) [18]


> Daria   (13.12.05 15:19) [17]
> у меня 11 столбцов

блин, ну зачем же сразу секрет-то раскрывать :)


 
msguns ©   (2005-12-13 15:24) [19]

>Daria   (13.12.05 15:19) [17]
>у меня 11 столбцов

А если потом будет 12 ? Или 9 ? Опять в форум с криком "Хелп !" ? А вот взять и разобраться хотя бы в предоставленных тебе работающих кодах нельзя, да ? Я уже молчу о куче прекрасных статей на эту тему.

Ну хот здесь почитай, родная !
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=502


 
umbra ©   (2005-12-13 15:32) [20]

примерно так

var
myrange: variant;
i, colcount, rowcount: integer;
{..........................}
myrange := Worksheets[1].UsedRange;
colcount := myrange.Columns.Count;
rowcount := myrange.Rows.Count;
for i:= 1 to rowcount do
    if myrange.Cells[i, colcount].Value = 0 then
         myrange.Rows[i].Interior.Colorindex := 3;
myrange := UnAssigned;  
{..............................}


 
Rater ©   (2005-12-13 15:56) [21]

а может просто в Экселе макрос написать?
а ещё там есть формат ячейки где отрицательные красненьким выделяются.
Может порыть Эксель?
ЗЫ Всё зависит от контекста задачи.


 
Игорь Шевченко ©   (2005-12-13 16:03) [22]


> у меня 11 столбцов


Первый раз вижу даму с одиннадцатью столбцами. Забавная какая анатомия.
Я из скромности не буду спрашивать их местонахождение.

А по сабжу - оно котлеты жарить неплохо или пирожки.



Страницы: 1 вся ветка

Текущий архив: 2006.01.01;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.054 c
14-1134311456
Иван Петрович
2005-12-11 17:30
2006.01.01
Вопрос наверно лмера)


8-1122372695
рост
2005-07-26 14:11
2006.01.01
IAMTVTuner как задать нестадартные частоты телеканалов


14-1133987105
Ильичев С.А.
2005-12-07 23:25
2006.01.01
Перевод


2-1134472960
Alex_1234
2005-12-13 14:22
2006.01.01
Удаление записи в запросе


14-1134315152
Kerk
2005-12-11 18:32
2006.01.01
Какими не надо делать пользовательские интерфейсы.