|
Помогите написать экспорт в Excel
|
|||
---|---|---|---|
#18+
Добрый день! Есть такая бухгалтерская программа, называется Xero. Мне нужно из нее наладить автоматический экспорт либо в Excel либо напрямую в базу SQL Server. По аналогии с ручным экпортом (Standard export.png в приложении). У этой программы есть API, которая возвращает инвойсы в виде объекта ("invoice object.png" & "C# object.png" в приложении). Некоторые столбцы вытаскиваются легко, например: invoice.Contact.Name А некоторые выдают ошибку (error.png): invoice.Contact.Addresses[0].AddressLine1 Думаю, что из-за того, что в у многих инвойсов значение отсутствует для AddressLine1, AddressLine2, AddressLine3, AddressLine4 (invoice object.png & standard export.png). Я попробовал такой подход: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Ругается на эту строку: Код: c# 1.
Cannot convert type 'Xero.Api.Core.Model.Address' to 'string' Как это поправить? А также, как тоже самое сделать отправляя данные напрямую в базу? На данный момент я использую экспорт в csv: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Модератор: Учимся использовать тэги оформления кода - FAQ Не ругайте сильно, я не программер. Форум не позволяет много приложений. Приложения здесь: https://1drv.ms/u/s!At756qpwT4usgrgB3ZYf-2XMNikrvQ?e=F6bF9o Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2019, 02:58 |
|
Помогите написать экспорт в Excel
|
|||
---|---|---|---|
#18+
Roust_m, Вы пишите, что ошибка в методе convertInvoiceToString Cannot convert type 'Xero.Api.Core.Model.Address' to 'string' , а на скриншоте-ArgumentOutOfRangeException- 2 ошибки? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2019, 09:15 |
|
Помогите написать экспорт в Excel
|
|||
---|---|---|---|
#18+
vb_subRoust_m, Вы пишите, что ошибка в методе convertInvoiceToString Cannot convert type 'Xero.Api.Core.Model.Address' to 'string' , а на скриншоте-ArgumentOutOfRangeException- 2 ошибки? На скриншоте ошибка когда я делаю вот так, без цикла: Код: c# 1.
А если делаю так: Код: c# 1. 2. 3.
То ошибка другая: Cannot convert type 'Xero.Api.Core.Model.Address' to 'string' Модератор, прошу прощения, забыл про теги оформления, когда вспомнил, то как отредактировать не нашел. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2019, 09:44 |
|
Помогите написать экспорт в Excel
|
|||
---|---|---|---|
#18+
Roust_m, Вам нужно обернуть Ваш инвойс в POCO класс и написать XML-десериализатор, который будет принимать invoice object и преобразовывать его в экземпляр класса. Мне не очень понятно, реализовано ли это у Вас, поэтому на всякий случай напишу. Попробуйте заменить на Код: c# 1. 2. 3.
и в точке останова посмотреть, что из себя представляет объект Address, и почему он не может быть конвертирован в строку. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2019, 10:15 |
|
Помогите написать экспорт в Excel
|
|||
---|---|---|---|
#18+
vb_subRoust_m, Вам нужно обернуть Ваш инвойс в POCO класс и написать XML-десериализатор, который будет принимать invoice object и преобразовывать его в экземпляр класса. Мне не очень понятно, реализовано ли это у Вас, поэтому на всякий случай напишу. Попробуйте заменить на Код: c# 1. 2. 3.
и в точке останова посмотреть, что из себя представляет объект Address, и почему он не может быть конвертирован в строку. Есть некоторый прогресс: компилирует я и не падает при выполнении, но в Экселе пустое значение для AddressLine1 для всех инвойсов, чего не может быть. Address не публичный член и имеет сложную структуру (C# object.png по ссылке в первом посте). Вот пример его преобразованного в XML: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Полная версия примера инвойса в "invoice object.xml" по ссылке в первом посте. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2019, 11:24 |
|
Помогите написать экспорт в Excel
|
|||
---|---|---|---|
#18+
Roust_m, Ваша проблема в Xero вой структуре возвращаемого XML-файла. В одной секции Код: xml 1. 2. 3. 4. 5. 6. 7.
есть подтег AddressLine1,AddressLine2, а в другом таком же его нет Код: xml 1. 2. 3.
Вот из-за этого Вы и получаете ошибку- Ваш код ожидает, что в теге Address есть подтег AddressLine1 Код: c# 1.
, а фактически его нет. Варианты решений: 1) Если есть доступ к редактированию сервиса, то переписать выгружаемые XML, так чтобы они соответствовали предсказуемой схеме, например для Вашего случая вторая секция должны быть Код: xml 1. 2. 3. 4. 5. 6. 7.
2) Если нет доступа, то тогда перед считыванием тегов делайте проверку на наличие узлов в XML файле. PS. Пользуйтесь xml- ориентированными инструментами для парсинга- в данном случае они для Вас будут удобнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2019, 12:24 |
|
Помогите написать экспорт в Excel
|
|||
---|---|---|---|
#18+
vb_sub, Возможности редактирования нет. Есть API, с которой приходится работать. А как можно сделать проверку наличия узлов (прошу прощения за глупый вопрос, но я не разработчик). Вот что у меня получилось: Код: c# 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.
Вот этот кусок вообще пришлось закомментировать: Код: c# 1.
ибо дает ошибку: System.ArgumentOutOfRangeException: 'Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index' Там наверное еще один внутренний цикл нужен. У меня должно на выходе получиться то же самое что в файле SampleExport.csv по ссылке выше, а получается MyExport.csv. Простые элементы выводятся, а сложные пустые получаются. Плюс еще в некоторых местах выходит вот такое: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Полный пример XML от Xero в файле invoices.xml. Может там запятые попали? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2019, 13:29 |
|
Помогите написать экспорт в Excel
|
|||
---|---|---|---|
#18+
Roust_m, Что Вам конкретно нужно получить после обработки XML-файла? PS. Если Вы не разработчик, то почему Вам приходится копаться в коде? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2019, 13:43 |
|
Помогите написать экспорт в Excel
|
|||
---|---|---|---|
#18+
vb_subRoust_m, Что Вам конкретно нужно получить после обработки XML-файла? PS. Если Вы не разработчик, то почему Вам приходится копаться в коде? Мне нужно получить файл подобный SampleExport.csv со всеми его столбцами. Приходится копаться, потому, что контора маленькая. Задача выглядит достаточно тривиальная. Если я на примере инвойсов научусь этому экспорту, то смогу и другие вещи делать. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2019, 13:54 |
|
Помогите написать экспорт в Excel
|
|||
---|---|---|---|
#18+
Мне хотя бы на паре примеров научиться вытаскивать такие вещи как: Код: c# 1. 2. 3.
Остальное я по аналогиии сделаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2019, 14:05 |
|
Помогите написать экспорт в Excel
|
|||
---|---|---|---|
#18+
По сути, почти все работает, если закоментарить сложные объекты, то экпорт получается как надо (понятно, что некоторые столбцы отсутствуют, но зато все аккуратно): Код: c# 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2019, 14:07 |
|
Помогите написать экспорт в Excel
|
|||
---|---|---|---|
#18+
У меня на Github весь солюшн лежит. Могу дать доступ. Помогите пжлста. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2019, 14:10 |
|
Помогите написать экспорт в Excel
|
|||
---|---|---|---|
#18+
Roust_m, Вам нужно 1)Создать класс для хранения информации об объекте из XML. Грубо говоря можете воспользоваться каким- либо сервисами типа xmltoCsharp, но лучше сделать все самому руками. Будет что-то вроде: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
2) Создайте метод, который буде на вход принимать xml, а на выходе будет отдавать коллекцию объектов MyClass. В данном методе Вам нужно будет реализовать парсинг xml файла. Не читайте xml как текстовый файл. Используйте, что-то вроде System.Xml или в крайний случай при правильной реализации и linq будет достаточно. В этом методе и реализуете проверки на наличие узлов, их чтение и преобразование в экземпляр класса MyClass. 3)Когда весь xml прочтете, у Вас будет коллекция MyClass, которую сможете или выгрузить в csv или записать в базу, на Ваш вкус. Используйте nuget-пакеты для экспорта в excel, не помню точно как называется, но вроде есть пару рабочих. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2019, 14:14 |
|
Помогите написать экспорт в Excel
|
|||
---|---|---|---|
#18+
vb_subRoust_m, Вам нужно 1)Создать класс для хранения информации об объекте из XML. Грубо говоря можете воспользоваться каким- либо сервисами типа xmltoCsharp, но лучше сделать все самому руками. Будет что-то вроде: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
2) Создайте метод, который буде на вход принимать xml, а на выходе будет отдавать коллекцию объектов MyClass. В данном методе Вам нужно будет реализовать парсинг xml файла. Не читайте xml как текстовый файл. Используйте, что-то вроде System.Xml или в крайний случай при правильной реализации и linq будет достаточно. В этом методе и реализуете проверки на наличие узлов, их чтение и преобразование в экземпляр класса MyClass. 3)Когда весь xml прочтете, у Вас будет коллекция MyClass, которую сможете или выгрузить в csv или записать в базу, на Ваш вкус. Используйте nuget-пакеты для экспорта в excel, не помню точно как называется, но вроде есть пару рабочих. Я наверное неправильно объяснил, мне никто не дает XML, у меня есть API, который представляет каждый инвойс в виде объекта: https://1drv.ms/u/s!At756qpwT4usgrgLXjzivUF_7HCr3Q?e=yfIfh9 Мне надо его преобразовать в Excel (csv). XML это еще одно представление инвойсов, чтобы из XML его преобразовать, мне придется сначала его в XML загнать, а это получается двойная работа. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2019, 14:28 |
|
Помогите написать экспорт в Excel
|
|||
---|---|---|---|
#18+
Roust_m, Вам Api сразу предоставляет POCO экземпляр класса? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2019, 14:32 |
|
Помогите написать экспорт в Excel
|
|||
---|---|---|---|
#18+
vb_subRoust_m, Вам Api сразу предоставляет POCO экземпляр класса? Не могу точно ответить на этот вопрос. Скорее всего да, все зашито. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2019, 14:40 |
|
Помогите написать экспорт в Excel
|
|||
---|---|---|---|
#18+
Roust_m, давайте Github, по возможности посмотрю. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2019, 15:17 |
|
Помогите написать экспорт в Excel
|
|||
---|---|---|---|
#18+
vb_sub, Я солюшн выложил в эту папку: https://onedrive.live.com/?authkey=!AN2WH_tlzDYpK70&id=AC8B4F70AAEAF9DE!39937&cid=AC8B4F70AAEAF9DE Подпапка "Xero-Net-master". Можете сами попробовать. Там только надо аккаунт у них завести и демо компанию создать: https://developer.xero.com/documentation/getting-started/getting-started-guide 1. Get setup Signup for a free Xero account Enable the Xero demo company Add your application (you’ll be prompted to login to Xero first) После этого надо в солюшене ключи поменять: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Ключи беруться отсюда: https://1drv.ms/u/s!At756qpwT4usgr1hMgRsHSirWCmPQg?e=yfuTeq ... |
|||
:
Нравится:
Не нравится:
|
|||
26.06.2019, 15:32 |
|
Помогите написать экспорт в Excel
|
|||
---|---|---|---|
#18+
vb_subRoust_m, давайте Github, по возможности посмотрю. Пока писал ответ, не заметил пост. А на какой логин Гитхаба выслать доступ? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2019, 01:40 |
|
Помогите написать экспорт в Excel
|
|||
---|---|---|---|
#18+
Roust_m, напиши в дискорд ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2019, 09:47 |
|
Помогите написать экспорт в Excel
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2019, 04:23 |
|
Помогите написать экспорт в Excel
|
|||
---|---|---|---|
#18+
а в чем смысл сих строк? Код: c# 1. 2. 3.
ты в цикле получаешь переменную Address, но не используешь ее, а принудительно всегда берешь Addresses[0]... Выглядит странно. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2019, 19:24 |
|
Помогите написать экспорт в Excel
|
|||
---|---|---|---|
#18+
iskatelsqlа в чем смысл сих строк? Код: c# 1. 2. 3.
ты в цикле получаешь переменную Address, но не используешь ее, а принудительно всегда берешь Addresses[0]... Выглядит странно. Это мне подсказали так сделать. Я сам не вполне понимаю, думаю это вариант проверки существования этого нода в объекте. Не у всех инвойсов есть даже AddressLine1, но их может быть до 4-х: AddressLine1, AddressLine2, AddressLine3, AddressLine4. А когда доходит до нодов типа: invoice.LineItems[0].Tracking[1].Name То получается два вложенных цикла надо делать, чтобы просто проверить существование ноды. Выглядит криво, думаю есть способ получше, но пока я его не нашел. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2019, 02:26 |
|
Помогите написать экспорт в Excel
|
|||
---|---|---|---|
#18+
Я переписал этот кусок, так будет наверное более правильно: Код: c# 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2019, 04:58 |
|
Помогите написать экспорт в Excel
|
|||
---|---|---|---|
#18+
Roust_mЯ переписал этот кусок, так будет наверное более правильно: Код: c# 1.
Жесть. Вообще за такое по рукам бьют. Откройте для себя класс StringBuilder . ... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2019, 05:56 |
|
|
start [/forum/topic.php?fid=20&msg=39831844&tid=1398871]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
160ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
1ms |
others: | 254ms |
total: | 530ms |
0 / 0 |