Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/43: Рейтинг темы: голосов - 43, средняя оценка - 4.70
0 / 0 / 0
Регистрация: 12.08.2010
Сообщений: 23

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

12.08.2010, 08:21. Показов 8493. Ответов 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.08.2010, 08:21
Ответы с готовыми решениями:

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

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

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

12
 Аватар для nFalcon
143 / 49 / 2
Регистрация: 04.06.2008
Сообщений: 126
12.08.2010, 10:47
Zhukovms,
Excel сам умеет прекрасно разбивать данные с разделителем (Меню: Данные-Текст по столбцам)
Или нужно именно с помощью Дельфи?
0
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
12.08.2010, 10:52
Предлагаю демонстрацию того, как для данной задачи можно выполнить завершённый цикл обработки: подключение к 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  [ТС]
Excel поддерживает только 65535 строк на одном листе.В текстовом файле строк намного больше.Можно ли с помощью макроса сделать так,чтобы данные которые не помещаются на 1лист автоматически переносились на 2лист и т.д. Либо, чтобы был выбор с какой даты выводить в Excel. если данные процедуры можно сделать с помощью макросов, то в Delphi не надо делать
0
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
12.08.2010, 10:59
Можно через VBA сделать. Но там код получится не меньший чем в Delphi, хотя по скорости будет быстрее - т. к. работа будет идти без посредства COM интерфейсов.
0
0 / 0 / 0
Регистрация: 12.08.2010
Сообщений: 23
12.08.2010, 11:06  [ТС]
Mawrat, спасибо за код. Как я понял он будет выводить по столбцам. Да нужно,чтобы был выбор даты, т.к. после 65365 записи в Excel выскочит ошибка,что не хватает строк на листе. Либо чтобы после 65365 строки он автоматически выводил на следующем листе и т.д. С датой мне кажется удобнее будет. Если есть возможность выложить код с поиском даты в строке буду очень благодарен.
0
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
12.08.2010, 11:41
Цитата Сообщение от Zhukovms Посмотреть сообщение
Если есть возможность выложить код с поиском даты в строке буду очень благодарен.
Вечером реализую с фильтром по датам.
0
0 / 0 / 0
Регистрация: 12.08.2010
Сообщений: 23
12.08.2010, 11:45  [ТС]
Спасибо большое заранее.Буду ждать
0
 Аватар для nFalcon
143 / 49 / 2
Регистрация: 04.06.2008
Сообщений: 126
12.08.2010, 12:48
Zhukovms,
Цитата Сообщение от Zhukovms Посмотреть сообщение
Excel поддерживает только 65535 строк на одном листе
Начиная с 2007 офиса этого ограничения нет
0
0 / 0 / 0
Регистрация: 12.08.2010
Сообщений: 23
12.08.2010, 13:45  [ТС]
Нету возможности купить лицензию на офис 2007.А пиратская копия на предприятии очень опасно
0
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
13.08.2010, 01:30
Вот вариант с фильтром по датам. Код масштабируемый - можно добавлять другие фильты и прочие возможности.
Сейчас сделана настройка на формат даты: '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 Кб, 78 просмотров)
0
0 / 0 / 0
Регистрация: 12.08.2010
Сообщений: 23
13.08.2010, 08:14  [ТС]
Спасибо огромное!!!Все работает отлично.
0
 Аватар для yaku
1 / 1 / 0
Регистрация: 30.05.2009
Сообщений: 25
23.03.2011, 16:39
)))))) а на С++ случайно нет кода для подобной затеи. борюсь с тем же, надо построково считать численные значения и записать либо в отдельный файл, а ещё лучше в таблицу. буду очень признателен за совет или посильную помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.03.2011, 16:39
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru