0 / 0 / 0
Регистрация: 12.08.2010
Сообщений: 23
1

Считывание данных из текствого файла и запись в EXCEL по столбцам

12.08.2010, 08:21. Показов 7353. Ответов 12
Метки нет (Все метки)

Добрый день!
Подскажите, пожайлуста, как мне сделать средствами Delphi программу, которая будет считывать строки из текстового файла и записывать их по столбцам в Excel.
Каждая строка состоит из нескольких данных, разделенные запятой.
Вот пример:
2706462,21/06/2010,04:16:19.560,2389.371,1328.59,5525,2337,0.8,27.2,58
2706463,21/06/2010,04:16:20.560,2390.371,1330.14,5580,2306,0.8,27.2,58
2706464,21/06/2010,04:16:21.560,2391.371,1331.68,5565,2331,0.9,27.2,59
2706465,21/06/2010,04:16:22.560,2392.371,1333.22,5565,2346,0.8,27.2,58
2706466,21/06/2010,04:16:23.560,2393.371,1334.77,5567,2323,0.8,27.2,59
2706467,21/06/2010,04:16:24.560,2394.371,1336.32,5575,2336,0.9,27.2,59
2706468,21/06/2010,04:16:25.560,2395.371,1337.86,5559,2317,0.9,27.2,58
2706469,21/06/2010,04:16:26.560,2396.371,1339.42,5599,2335,0.9,27.2,59
2706470,21/06/2010,04:16:27.560,2397.371,1340.96,5540,2356,0.9,27.2,58

Нужно сделать так, чтобы в Excel получилось 10 столбцов и был выбор вывода информациив Excel по нужной дате
Заранее благодарен!
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.08.2010, 08:21
Ответы с готовыми решениями:

Считывание данных из Excel файла
Добрый день. Нужна помощь. Нужно считать данные из Excel файла и при вводе с клавиатуры цифры от...

Считывание данных из запароленного файла Excel
Доброго времени суток! Возникла такая ситуация....считываю данные из Excel файла и с этим проблем...

Считывание данных из файла и запись в динамические массивы
Помогите реализовать следующую задачу: Есть файл содержания 40.1 50.1 60.1 70.1 11:15:23...

Считывание данных из файла и запись результатов в файл
Здравствуйте. Необходимо переделать этот код: #include <iostream> using namespace std; ...

12
143 / 49 / 2
Регистрация: 04.06.2008
Сообщений: 126
12.08.2010, 10:47 2
Zhukovms,
Excel сам умеет прекрасно разбивать данные с разделителем (Меню: Данные-Текст по столбцам)
Или нужно именно с помощью Дельфи?
0
13074 / 5859 / 1706
Регистрация: 19.09.2009
Сообщений: 8,807
12.08.2010, 10:52 3
Предлагаю демонстрацию того, как для данной задачи можно выполнить завершённый цикл обработки: подключение к Excel, чтение из файла и запись данных на рабочий лист.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
uses
  ComObj;
 
procedure TForm1.Button1Click(Sender: TObject);
const
  //Имя файла с данными.
  Fn = 'data.txt';
  //Список разделителей полей. #9 - код знака горизонтальной табуляции.
  D = [',', ';', #9];
var
  F : TextFile;
  Str1, StrFld : String;
  i, Pos1, Pos2, Col, Row : Integer;
  EndRow : Boolean;
 
  //Ссылки на объекты OLE-автоматизации.
 
  //Excel.
  exApp : Variant;
  //Рабочая книга Excel.
  exBook : Variant;
  //Pабочий лист в книге Excel.
  exSheet : Variant;
begin
 
  try
 
    //Подключаемся к Excel и получаем ссылку на интересующий нас лист рабочей книги.
 
    //Подключаемся к Excel.
    exApp := CreateOleObject('Excel.Application');
    //Делаем видимым окно Excel.
    exApp.Visible := True;
    //Создаём раб. книгу Excel и подключаемся к ней.
    exBook := exApp.WorkBooks.Add;
    //Подключаемся к первому рабочему листу этой книги.
    exSheet := exBook.WorkSheets[1];
    //Если требуется, задаём называние листа.
    exSheet.Name := 'Данные. Лист 1';
 
    //Формируем шапку таблицы.
    for i := 1 to 10 do begin
      exSheet.Cells[1, i].Value := 'Fld' + IntToStr(i);
    end;
 
    //Читаем построчно данные из файла и записываем их на лист Excel.
 
    AssignFile(F, Fn);
    Reset(F);
    Pos1 := 0;
    Pos2 := 0;
    Col := 1;
    Row := 2; //2 - т. к. на строке 1 расположена шапка таблицы.
    EndRow := False;
    while not Eof(F) do begin
      //Чтение очередной строки из файла.
      Readln(F, Str1);
      //Обрабатываем очередную прочитанную строку.
      for i := 1 to Length(Str1) do begin
        //Отслеживаем начало данных поля.
        if i = 1 then
          Pos1 := i
        else if Str1[i - 1] in D then
          Pos1 := i
        ;
        //Отслеживаем конец данных поля (ячейки) и конец данных строки.
        if i = Length(Str1) then begin
          Pos2 := i;
          EndRow := True;
        end else if Str1[i + 1] in D then
          Pos2 := i
        ;
        //Если найден конец данных очередного поля, то обрабатываем их.
        if Pos2 > 0 then begin
          //Извлекаем строковое значение для очередной ячейки (Row, Col).
          StrFld := Copy(Str1, Pos1, Pos2 - Pos1 + 1);
 
          //Здесь мы имеем полную информацию о текущем состоянии загрузки:
          //Номер текущей строки = Row, номер столбца = Col, данные ячейки = StrFld.
          //Здесь следует добавить свой код обработки данных.
          //
          //Начало.
 
          //Записываем данные в ячейку на листе Excel.
          exSheet.Cells[Row, Col].Value := StrFld;
 
          //Конец.
 
          //Корректируем значения счётчиков и флагов.
          Pos2 := 0;
          Inc(Col);
          if EndRow then begin
            Inc(Row);
            Col := 1;
            EndRow := False;
          end;
        end;
      end;
    end;
  finally
    //Закрываем файл.
    try CloseFile(F) finally end;
 
    //Отключаемся от объектов OLE-автоматизации.
    exSheet := Unassigned;
    exBook := Unassigned;
    exApp := Unassigned;
  end;
end;
Этот алгоритм можно разделить на функциональные части и сделать более гибкую реализацию. Например, извлечение данных полей из строки можно оформить в виде отдельной функции. Эта функция будет возвращать, сведения о полях в виде TStringList или дин. массива. Тогда открывается больший простор действий для анализа и манипулированя данными - например, можно выполнять для очередной прочитанной из файла строки проверку даты (поле №2) и в зависимости от её значения добавить эту строку на лист Excel, либо пропустить её. И пр.
Цитата Сообщение от nFalcon Посмотреть сообщение
Или нужно именно с помощью Дельфи?
Как я понял, надо в Excel отправлять только те данные, которые соответствуют определённому диапазону дат. Поэтому Delphi применяется. А так, если без предварительной обработки, то да - можно непосредственно открыть файл в Excel.
0
0 / 0 / 0
Регистрация: 12.08.2010
Сообщений: 23
12.08.2010, 10:54  [ТС] 4
Excel поддерживает только 65535 строк на одном листе.В текстовом файле строк намного больше.Можно ли с помощью макроса сделать так,чтобы данные которые не помещаются на 1лист автоматически переносились на 2лист и т.д. Либо, чтобы был выбор с какой даты выводить в Excel. если данные процедуры можно сделать с помощью макросов, то в Delphi не надо делать
0
13074 / 5859 / 1706
Регистрация: 19.09.2009
Сообщений: 8,807
12.08.2010, 10:59 5
Можно через VBA сделать. Но там код получится не меньший чем в Delphi, хотя по скорости будет быстрее - т. к. работа будет идти без посредства COM интерфейсов.
0
0 / 0 / 0
Регистрация: 12.08.2010
Сообщений: 23
12.08.2010, 11:06  [ТС] 6
Mawrat, спасибо за код. Как я понял он будет выводить по столбцам. Да нужно,чтобы был выбор даты, т.к. после 65365 записи в Excel выскочит ошибка,что не хватает строк на листе. Либо чтобы после 65365 строки он автоматически выводил на следующем листе и т.д. С датой мне кажется удобнее будет. Если есть возможность выложить код с поиском даты в строке буду очень благодарен.
0
13074 / 5859 / 1706
Регистрация: 19.09.2009
Сообщений: 8,807
12.08.2010, 11:41 7
Цитата Сообщение от Zhukovms Посмотреть сообщение
Если есть возможность выложить код с поиском даты в строке буду очень благодарен.
Вечером реализую с фильтром по датам.
0
0 / 0 / 0
Регистрация: 12.08.2010
Сообщений: 23
12.08.2010, 11:45  [ТС] 8
Спасибо большое заранее.Буду ждать
0
143 / 49 / 2
Регистрация: 04.06.2008
Сообщений: 126
12.08.2010, 12:48 9
Zhukovms,
Цитата Сообщение от Zhukovms Посмотреть сообщение
Excel поддерживает только 65535 строк на одном листе
Начиная с 2007 офиса этого ограничения нет
0
0 / 0 / 0
Регистрация: 12.08.2010
Сообщений: 23
12.08.2010, 13:45  [ТС] 10
Нету возможности купить лицензию на офис 2007.А пиратская копия на предприятии очень опасно
0
13074 / 5859 / 1706
Регистрация: 19.09.2009
Сообщений: 8,807
13.08.2010, 01:30 11
Вот вариант с фильтром по датам. Код масштабируемый - можно добавлять другие фильты и прочие возможности.
Сейчас сделана настройка на формат даты: 'dd/mm/yyyy'. При задании фильтра в Edit1 и Edit2 даты следует задавать именно в таком формате.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
uses
  ComObj;
 
type
  //Тип, задающий динамический массив, элементами которого являются строки.
  //Массив такого типа будем использовать для хранения данных о значениях полей,
  //взятых из строки файла.
  TArrVal = array of String;
 
function GetListVal(const aStr : String) : TArrVal;
const
  //Величина приращения длины динамического массива.
  Capacity = 10;
  //Список разделителей полей. #9 - код знака горизонтальной табуляции.
  D = [',', ';', #9];
var
  i, j, Pos1, Pos2 : Integer;
begin
  Finalize(Result);
 
  //Позиция начала поля.
  Pos1 := 0;
  //Позиция конца поля.
  Pos2 := 0;
  //Индекс элемента массива значений полей.
  j := 0;
  for i := 1 to Length(aStr) do begin
    //Отслеживаем начало поля.
    if i = 1 then
      Pos1 := i
    else if aStr[i - 1] in D then
      Pos1 := i
    ;
    //Отслеживаем конец поля.
    if i = Length(aStr) then
      Pos2 := i
    else if aStr[i + 1] in D then
      Pos2 := i
    ;
    //Если найден конец поля, то обрабатываем его.
    if Pos2 > 0 then begin
      //Увеличиваем длину массива, если требуется.
      if Length(Result) = j then SetLength(Result, j + Capacity);
      //Добавляем строковое значение поля в массив.
      Result[j] := Copy(aStr, Pos1, Pos2 - Pos1 + 1);
      //Сбрасываем флаг конца поля.
      Pos2 := 0;
      //Индекс следующего элемента массива - для следующей итерации.
      Inc(j);
    end;
  end;
  //Корректируем длину массива в соответствие с количеством добавленных в него элементов.
  if j < Length(Result) then SetLength(Result, j);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
type
  //Тип, определяющий способ хранения данных о строковом формате даты.
  TDateFormat = record
    DateSeparator : Char;
    ShortDateFormat : String;
  end;
const
  //Имя файла с данными.
  Fn = 'data.txt';
var
  F : TextFile;
  Str1 : String;
  i, Col, Row : Integer;
  ArrVal : TArrVal;
  Date1, Date2, DateTmp : TDateTime;
  SaveDateFormat : TDateFormat;
 
  //Ссылки на объекты OLE-автоматизации.
 
  //Excel.
  exApp : Variant;
  //Рабочая книга Excel.
  exBook : Variant;
  //Pабочий лист в книге Excel.
  exSheet : Variant;
begin
  //Запоминаем текущий строковый формат даты.
  SaveDateFormat.DateSeparator := DateSeparator;
  SaveDateFormat.ShortDateFormat := ShortDateFormat;
  //Установка нового строкового формата даты.
  DateSeparator := '/';
  ShortDateFormat := 'dd/mm/yyyy';
 
  //Получаем сведения о фильтре по диапазону дат.
  //Внимание! Даты в Edit1 и в Edit2 следует задавать тоже в формате: 'dd/mm/yyyy'.
  Date1 := StrToDate( Edit1.Text );
  Date2 := StrToDate( Edit2.Text );
 
  try
    //Подключаемся к Excel и получаем ссылку на интересующий нас лист рабочей книги.
 
    //Подключаемся к Excel.
    exApp := CreateOleObject('Excel.Application');
    //Делаем видимым окно Excel.
    exApp.Visible := True;
    //Создаём раб. книгу Excel и подключаемся к ней.
    exBook := exApp.WorkBooks.Add;
    //Подключаемся к первому рабочему листу этой книги.
    exSheet := exBook.WorkSheets[1];
    //Если требуется, задаём называние листа.
    exSheet.Name := 'Данные. Лист 1';
 
    //Формируем шапку таблицы.
    for i := 1 to 10 do begin
      exSheet.Cells[1, i].Value := 'Fld' + IntToStr(i);
    end;
 
    //Читаем построчно данные из файла и записываем их на лист Excel.
 
    AssignFile(F, Fn);
    Reset(F);
    //Индекс верхней строки области данных в таблицы Excel.
    //2 - т. к. на строке 1 расположена шапка таблицы.
    Row := 2;
    while not Eof(F) do begin
      //Чтение очередной строки из файла.
      Readln(F, Str1);
      //Получаем из строки список значений полей.
      ArrVal := GetListVal(Str1);
 
      //Если меньше двух полей - пропускаем итерацию.
      if Length(ArrVal) < 2 then Continue;
      //Если второе поле содержит неверное представление даты - пропускаем итерацию.
      if not TryStrToDate(ArrVal[1], DateTmp) then Continue;
      //Если дата не принадлежит заданному диапазону - пропускаем итерацию.
      if not ( (DateTmp >= Date1) and (DateTmp <= Date2) ) then Continue;
 
      //Переписываем значения полей в строку таблицы на листе Excel.
      Col := 1;
      for i := 0 to High(ArrVal) do begin
        exSheet.Cells[Row, Col].Value := ArrVal[i];
        Inc(Col);
      end;
      //Переходим к следующей строке таблицы Excel.
      Inc(Row);
    end;
  finally
    //Закрываем файл.
    try CloseFile(F) finally end;
 
    //Отключаемся от объектов OLE-автоматизации.
    exSheet := Unassigned;
    exBook := Unassigned;
    exApp := Unassigned;
 
    //Освобождаем память, выделенную для динамического массива
    //и для его элементов - строк.
    Finalize(ArrVal);
 
    //Возвращем прежний формат строкового представления даты.
    DateSeparator := SaveDateFormat.DateSeparator;
    ShortDateFormat := SaveDateFormat.ShortDateFormat;
  end;
end;
 
end.
Вложения
Тип файла: rar WorkWithExcel.rar (173.7 Кб, 69 просмотров)
0
0 / 0 / 0
Регистрация: 12.08.2010
Сообщений: 23
13.08.2010, 08:14  [ТС] 12
Спасибо огромное!!!Все работает отлично.
0
1 / 1 / 0
Регистрация: 30.05.2009
Сообщений: 25
23.03.2011, 16:39 13
)))))) а на С++ случайно нет кода для подобной затеи. борюсь с тем же, надо построково считать численные значения и записать либо в отдельный файл, а ещё лучше в таблицу. буду очень признателен за совет или посильную помощь.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.03.2011, 16:39

Считывание данных в двумерный массив из Excel файла
Здравствуйте дорогие форумчане! У меня возник вопрос ответ на который я сам не смог найти поэтому...

Считывание данных с Excel файла и ошибка IndexOutOfRange
Пытаюсь считать данные с *.xlsx файла. rng - объект класса Range, ws - Объект класса WorkSheet....

Считывание из бинарного файла и запись данных в две строковых переменные
Мне нужно считать две строки из бинарного файла &quot;input.txt&quot; и запихать их в переменные типа string....

Парсинг текстового файла и запись данных в Excel
есть текстовый док с такими строками : HS oper-209 UN Linux HS oper-203 UN Linux нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.