Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование, связанное с MS Office > Синхронизация текстового файла и таблицы excel


Автор: klassik 4.7.2008, 16:43
Есть текстовый файл. У него есть определённая структура. Состоит из строковых и числовых значений. Надо сделать так, чтобы EXCEL открыл этот файл, расставил все значения по определённым столбцам и строкам. После изменения этих значений в EXCELe я мог бы сохранить в этот же текстовый файл с той же структурой.

Можно ли это сделать используя XML и XSD?

Стркутура примерно такая:

Код

узел БАЛЛОН
    масса 10
    теплоёмкость 8000
    степень черноты 0.7
конец узла БАЛЛОН

Можно, наверное, сделать и с помощью VBA, но мне показалось при чтении про XML, что это проще, или может быть более гибко. Т.е. при изменении структуры исходного файл, мне достаточно будет изменить файл XML или XSD.

И ещё может быть надо знать что-такое парсинг?

Автор: LOPUH 4.7.2008, 17:59
Можно пояснить поподробнее:
Цитата(klassik @  4.7.2008,  21:43 Найти цитируемый пост)


узел БАЛЛОН
    масса 10
    теплоёмкость 8000
    степень черноты 0.7
конец узла БАЛЛОН

 Это в текстовом файле   до или после преобразования? Как вы хотите сохранить вашу информацию в Excel? Наиболее оптимально бы было воспользоваться деревьями, но боюсь, в VBA  такой возможности нет..  для написания парсеров надо бы полноценный язык программирования.. Но если вы владеете только VBA, скиньке образцы файлов- до и после преобразования, может что нибудь придумаем..



Автор: Akina 4.7.2008, 21:28
Все это - только программно. 

Автор: klassik 4.7.2008, 23:27
Цитата(LOPUH @ 4.7.2008,  17:59)
Можно пояснить поподробнее:
Это в текстовом файле   до или после преобразования?

И до и после. Мне просто неудобно редактировать и анализировать этот файл в текстовом редакторе.
А в EXCELe я смог бы подбирать нужные характеристики прибора. 

Цитата(LOPUH @ 4.7.2008,  17:59)
Можно пояснить поподробнее:
Как вы хотите сохранить вашу информацию в Excel?

Не важно. Самое главное, чтобы на входе и навыходе был именно такой текстовый файл.
Хотя в будущем, возможно текстовый файл будет дополняться.

Цитата(LOPUH @ 4.7.2008,  17:59)
Можно пояснить поподробнее:
Наиболее оптимально бы было воспользоваться деревьями, но боюсь, в VBA  такой возможности нет..  для написания парсеров надо бы полноценный язык программирования.. Но если вы владеете только VBA, скиньке образцы файлов- до и после преобразования, может что нибудь придумаем..

Я владею больше С++. Правда только наподобие borland C++ 3.1. Но со временем я изучу С++ для Windows.

Присоединил файл, но там не все возможные характеристики.
Причём эти характеристики в новом варианте записываются немного в другой последовательности.

Автор: LOPUH 7.7.2008, 05:10
Судя по
Цитата

NODE BAK_3
................
................
END NODE BAK_3

 NODE RADIATOR
................
................
 END NODE RADIATOR

используется некая коллекция (стек ,очередь,дерево) объктов. Вышеописанные структуры так и напрашиваются на создание  виртуального родительского объекта, который бы  инкапсулировал  все возможные поля и ,соответственно ,
методы их хранения. Потом при считывании текстового файла  находим строчку 
Цитата

NODE ....

создаем объект-потомок, далее , пока не встретим 
Цитата

END NODE 
инициализируем в нем поля .
НО увы.. VBA лишен  наследования у пользовательских объектов.  Единственное  более-менее приемлимое решение -
использование XML.  Для работы  с ним в VBA предназначена библиотека MSXML ( Tools -> References ->Microsoft XML,v.5.0) Создаете  объект DOMDocument. У объекта DOMDocument есть методы CreateNode  и CreateElement, создающие узлы и элементы с соответствующими именами.Если захотите идти по  предложенному(кстати,вами) пути   использование XML, задавайте конкретные вопросы, постараюсь помочь..  

Автор: Akina 7.7.2008, 08:11
Цитата(LOPUH @  7.7.2008,  06:10 Найти цитируемый пост)
Если захотите идти по  предложенному(кстати,вами) пути   использование XML

Исходный (и конечный) форматы у него заданы. Жестко. И этот формат - не XML. Настроить входной поток так, чтобы на входе в DOM преобразовывать имеющийся текст в XML (а MSXML к проблемам с форматом очень чувствителен) не выйдет.

В то же время обычный парсинг текстового файла никаких проблем не вызывает. Читай себе построчно, пихай куда надо. Список однонаправленный, невложенный, одного курсора достаточно... и не надо мудрить ни с XML, ни тем более с деревьями, которым тут вообще делать нечего.

Автор: LOPUH 7.7.2008, 09:47
Проблема здесь не в том, чтобы считать текстовый файл построчно.
Цитата(klassik @  4.7.2008,  21:43 Найти цитируемый пост)
Надо сделать так, чтобы EXCEL открыл этот файл, расставил все значения по определённым столбцам и строкам. После изменения этих значений в EXCELe я мог бы сохранить в этот же текстовый файл с той же структурой.

Основная проблема придумать механизм храненения и редактирования данных. и последующего экспорта в текстовый файл. Так как мы имеем  жестко структурированные данные,  то придумать что то лучше XML сложно.

Цитата(Akina @  7.7.2008,  13:11 Найти цитируемый пост)
 Настроить входной поток так, чтобы на входе в DOM преобразовывать имеющийся текст в XML (а MSXML к проблемам с форматом очень чувствителен) не выйдет.

С XML я не работал как то не возникало нужды.. Но мне почему то кажется,  что больших проблем возникать не должно. Чисто из спортивного интереса, когда появится свободное время, постараюсь написать макрос для экспорта..
Но  насчет сроков пока ничего сказать не могу, ибо занят  smile 

Автор: krb 7.7.2008, 23:59
У меня вопрос!!!
Есть Excel таблица с данными(информация о клиенте, даты, суммы и пр.). Нужно вытащить эти данные и поместить их Word документы. Расположение этих данных в Worde различаются.  
Как это сделать???

Автор: Akina 8.7.2008, 08:01
Цитата(krb @  8.7.2008,  00:59 Найти цитируемый пост)
Как это сделать???

Не лезть в чужую тему, да к тому же не по делу, а создать свою. Это для начала.

Автор: klassik 9.7.2008, 12:02
Цитата(LOPUH @ 7.7.2008,  05:10)

библиотека MSXML ( Tools -> References ->Microsoft XML,v.5.0) Создаете  объект DOMDocument.

Я нашёл:
DOMDocument
DOMDocument26
DOMDocument30
DOMDocument40
DOMDocument50
В чём различие?

Автор: LOPUH 9.7.2008, 12:18
В версии.. лучше всего пользоваться 5.0 Да, кстати наверно можно обойтись без XML, я думаю  Akina прав.. Завтра постараюсь скинуть примерчик, хотя не гарантирую, может опять работа навалиться.. smile 

Автор: klassik 9.7.2008, 12:31
Почему то справки нет по этому объекту.

Автор: LOPUH 9.7.2008, 12:39

Цитата(klassik @  9.7.2008,  17:31 Найти цитируемый пост)
Почему то справки нет по этому объекту

Ну это ActiveX  компонент, ее и не должно быть..  Погуглите...

Автор: klassik 9.7.2008, 13:32
Цитата(LOPUH @ 9.7.2008,  12:18)
Да, кстати наверно можно обойтись без XML, я думаю  Akina прав.. 

Так может с XML в дальнейшем будет удобнее.
Если у меня добавятся характеристики узла в текстовом файле.

Автор: LOPUH 9.7.2008, 13:43
Ладно попорбуем с XML. Просто у меня появились определенные соображения как такие структуры можно хранить в VBA. И в этом свете добавка  новой структуры вполне реализуема..  

Автор: LOPUH 9.7.2008, 14:33
Такой вопрос : поля Emission, Resist, Absorbtion  везде имеют разную длину..   Имеет ли значение формат их вывода, то есть сколько значений выводится в одну  строчку?

Автор: klassik 9.7.2008, 14:55
Код

    NODE BAK    
      SPHERE OUTSIDE 4 8 1 -90 90 0 360 DEF/1    
      CAPACITY 1000    
      TEMPERATURE 293    
      ABSORBTION    
      1 1 1 1 1 1 1 1 1 1    
      1 1 1 1 1 1 1 1 1 1    
      1 1 1 1 1 1 1 1 1 1    
      1 1    
      EMISSION    
      1 1 1 1 1 1 1 1 1 1    
      1 1 1 1 1 1 1 1 1 1    
      1 1 1 1 1 1 1 1 1 1    
      1 1    
      RESIST    
      0 0 0 0 0 0 0 0 0 0    
      0 0 0 0 0 0 0 0 0 0    
      0 0 0 0 0 0 0 0 0 0    
      0 0    
    END NODE BAK    

Не больше десяти.

Узел сфера. 4х8 = 32 площадки. И у каждой свои характеристики. Радиус единица.
Строка SPHERE OUTSIDE 4 8 1 -90 90 0 360 DEF/1    не важна. Потому-что геометрические характеристики меняются гораздо реже. Важны только характеристики узла.

Автор: LOPUH 9.7.2008, 17:07
Oх, чем дальше в лес.. Но во втором вашем аттаче я не вижу строки 
Цитата(klassik @  9.7.2008,  19:55 Найти цитируемый пост)
SPHERE OUTSIDE 4 8 1 -90 90 0 360 DEF/1   

Так бы можно было определять длину массива для хранения данных..


Автор: klassik 9.7.2008, 17:32
Цитата(LOPUH @ 9.7.2008,  17:07)
Но во втором вашем аттаче я не вижу строки 
Цитата(klassik @  9.7.2008,  19:55 Найти цитируемый пост)
SPHERE OUTSIDE 4 8 1 -90 90 0 360 DEF/1   


Там много разный выриантов задания площадки. Тетраэдр, параллелепипед, конус, цилиндр. Но всё это не важно. Важны только характеристики узла.

Цитата(LOPUH @ 9.7.2008,  17:07)
Так бы можно было определять длину массива для хранения данных..
Не понял фразы. Количество высчитывается из самих характеристик:
      EMISSION    
      1 1 1 1 1 1 1 1 1 1    
      1 1 1 1 1 1 1 1 1 1    
      1 1 1 1 1 1 1 1 1 1    
      1 1    
32 штуки

Автор: LOPUH 14.7.2008, 10:09
Здравствуйте. Я снова тут..  Извините времени совершенно нет, поэтому решил пойти по пути наименьшего сопротвления. В  аттаче файлик созданный путем импорта данных из текстого файла ( ваш файалик 1.mod)и последующей заменой всех точек на запятые. При этом сгенерирован макрос(Макрос 4). Вид , конечно сырой, ро в ваших силах написать макрос , копирующий данные на следующий лист и форматирующий их соответственно. Увы поэкспериментировать c XML не получилось,  там нужно достаточно много кода и плотно разбираться, что позволить себе увы , пока не могу..

Автор: klassik 14.7.2008, 11:55
Спасибо. Буду разбираться самостоятельно.
В случае чего, буду задавать вопросы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)