Импорт данных объекта Table в файл EXCEL

Автор Тема: Импорт данных объекта Table в файл EXCEL  (Прочитано 7608 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Есть объект Autodesk.AutoCAD.DatabaseServices.Table
Необходимо перенести содержимое таблицы в Excel.

Как вариант решения задачи предать данные через буфер обмена.

Возможно ли это сделать AutoCAD API?

 

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Или думаю вот еще вариант.
Наверно так будет лучше, если
сделать через OLE

Тогда весь алгоритм заполнения ячеек
мне надо будет паралелльно писать для OLE
По сути взять ячейки Table и загнать их в OLE.

Или может есть готовое решение,
которое содержимое Table заносит в OLE?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Или думаю вот еще вариант.
Наверно так будет лучше, если
сделать через OLE

Тогда весь алгоритм заполнения ячеек
мне надо будет паралелльно писать для OLE
По сути взять ячейки Table и загнать их в OLE.

Или может есть готовое решение,
которое содержимое Table заносит в OLE?
Причем здесь OLE?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Необходимо перенести содержимое таблицы в Excel.
1. Это называется экспорт, а не импорт.
2. Есть стандартная команда _TABLEEXPORT: https://knowledge.autodesk.com/support/autocad/learn-explore/caas/CloudHelp/cloudhelp/2017/ENU/AutoCAD-Core/files/GUID-EC760CA9-5BF4-4CF3-90D3-63DB194D43EA-htm.html#mtc-russian
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
А есть аналогичное решение через API
вместо командной строки?
_TABLEEXPORT

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
А есть аналогичное решение через API
вместо командной строки?
_TABLEEXPORT
Готового в API метода нет. Так что нужно писать самому.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Спасибо за ответы!

Сделат так.
Особых требований к оформлению листов Excel не нужно
Просто перекинуть ячейки из Table в Excel

Код - vb.net [Выбрать]
  1.  
  2. Imports CAD_DBS = Autodesk.AutoCAD.DatabaseServices
  3.    Private Sub ExpotToExcel(ByVal Tab As CAD_DBS.Table, _
  4.                              ByVal ExcelTemplate As String, _
  5.                              ByVal ExcelNameResult As String)
  6.         Dim excel As New Microsoft.Office.Interop.Excel.Application
  7.         excel.Workbooks.Add(ExcelTemplate)
  8.         For r As Integer = 0 To Tab.Rows.Count - 1
  9.             For c As Integer = 0 To Tab.Columns.Count - 1
  10.                 Dim txt As String = Tab.Cells(r, c).GetTextString(CAD_DBS.FormatOption.IgnoreMtextFormat)
  11.                 If (txt <> "") Then
  12.                     excel.Range(excel.Cells(r + 2, c + 1), _
  13.                                 excel.Cells(r + 2, c + 1)).Select()
  14.                     excel.ActiveCell.FormulaR1C1 = txt
  15.                     excel.ActiveCell.WrapText = True
  16.                     excel.ActiveCell.EntireRow.AutoFit()
  17.                 End If
  18.             Next
  19.         Next
  20.         excel.ActiveWorkbook.SaveAs(ExcelNameResult)
  21.         excel.Quit()
  22.     End Sub


Оффлайн Denis

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Если интересно, то я сделал вот так. Делал для случая, когда пользователь сам выбирает таблицы, которые ему нужно экспортить.
На выходе просто открывался excel-документ при помощь Interop, пользователь сам решал, сохранять или нет.
Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. using Autodesk.AutoCAD.ApplicationServices;
  8. using Autodesk.AutoCAD.DatabaseServices;
  9. using Autodesk.AutoCAD.Runtime;
  10. using Autodesk.AutoCAD.EditorInput;
  11. using Autodesk.AutoCAD.Geometry;
  12.  
  13.  
  14. namespace ExportTables
  15. {
  16.     public class MainClass
  17.     {
  18.         static List<Table> tableList = new List<Table>();
  19.         static List<String> fullTextOfTables = new List<String>();
  20.  
  21.         [CommandMethod("ExportTables")]
  22.         public void ExportTables()
  23.         {
  24.             //Определение документа.
  25.             Document doc = Application.DocumentManager.MdiActiveDocument;
  26.             Database db = doc.Database;
  27.             DocumentCollection dm = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager;
  28.             Editor ed = dm.MdiActiveDocument.Editor;
  29.  
  30.  
  31.             // Запрос на выбор блоков
  32.             PromptSelectionOptions opts1 = new PromptSelectionOptions();
  33.             opts1.MessageForAdding = "Выберите все необходимые таблицы";
  34.             PromptSelectionResult acSSPrompt = doc.Editor.GetSelection(opts1);
  35.  
  36.             if (acSSPrompt.Status != PromptStatus.OK)
  37.             {
  38.                 ed.WriteMessage("Операция прервана пользователем\n");
  39.                 return;
  40.             }
  41.             DBObjectCollection acDBObjColl = new DBObjectCollection();
  42.             using (Transaction atr = doc.TransactionManager.StartTransaction())
  43.             {
  44.                 BlockTable bt = atr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  45.                 BlockTableRecord btr = atr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
  46.  
  47.                 // Проверка статуса и того, что мы выбрали что-то
  48.                 if (acSSPrompt.Status == PromptStatus.OK)
  49.                 {
  50.                     SelectionSet acSSet = acSSPrompt.Value;
  51.  
  52.                     // Проходим по каждому блоку из выбранных
  53.                     foreach (SelectedObject acSSObj in acSSet)
  54.                     {
  55.  
  56.                         // Проверяем, что есть выбранный элемент.
  57.                         if (acSSObj != null)
  58.                         {
  59.                             Entity ent = (Entity)atr.GetObject(acSSObj.ObjectId, OpenMode.ForWrite);
  60.                             if (ent is Table)
  61.                             {
  62.                                 Table tb = (Table)ent;
  63.                                 tableList.Add(tb);
  64.                             }
  65.                         }
  66.                     }
  67.                 }
  68.                 atr.Commit();
  69.             }
  70.  
  71.             //Экспорт всех таблиц.В конце строчки добавляем \r
  72.  
  73.             foreach (Table tb in tableList)
  74.             {
  75.                 for (int i = 0; i < tb.Rows.Count; i++)
  76.                 {
  77.                     for (int j = 0; j < tb.Columns.Count; j++)
  78.                     {
  79.                         if (j == tb.Columns.Count - 1)
  80.                         {
  81.                             string text = tb.Cells[i, j].TextString;
  82.                             try
  83.                             {
  84.                                 String textReturn = text.Split(';').ElementAt(1).Split('\\').ElementAt(0);
  85.                                 fullTextOfTables.Add(textReturn + "\r");
  86.                             }
  87.                             catch (ArgumentOutOfRangeException ex)
  88.                             {
  89.                                 fullTextOfTables.Add(tb.Cells[i, j].TextString + "\r");
  90.                             }
  91.                            
  92.                         }
  93.                         else
  94.                         {
  95.                             string text = tb.Cells[i, j].TextString;
  96.                             try
  97.                             {
  98.                                 String textReturn = text.Split(';').ElementAt(1).Split('\\').ElementAt(0);
  99.                                 fullTextOfTables.Add(textReturn);
  100.                             }
  101.                             catch (ArgumentOutOfRangeException ex)
  102.                             {
  103.                                 fullTextOfTables.Add(tb.Cells[i, j].TextString);
  104.                             }
  105.                            
  106.                         }
  107.                     }
  108.                 }
  109.             }
  110.  
  111.             //Вывод всех данных в Эксель.
  112.  
  113.             Microsoft.Office.Interop.Excel._Application excel = new Microsoft.Office.Interop.Excel.Application();
  114.             Microsoft.Office.Interop.Excel._Workbook workbook = excel.Workbooks.Add(Type.Missing);
  115.             Microsoft.Office.Interop.Excel._Worksheet worksheet = null;
  116.             Microsoft.Office.Interop.Excel.Range aRange;
  117.             Microsoft.Office.Interop.Excel.Borders _borders;
  118.  
  119.             try
  120.             {
  121.                 worksheet = workbook.ActiveSheet;
  122.                 worksheet.Name = "Exported";
  123.                 excel.Visible = true;
  124.  
  125.                 int cellRowIndex = 1;
  126.                 int cellColumnIndex = 1;
  127.                 aRange = worksheet.get_Range("A1", "F" + (fullTextOfTables.Select(o => o.Contains("\r")).Count()).ToString());
  128.                 //Проходим по всем строкам и столбцам.
  129.                 for (int i = 0; i < fullTextOfTables.Count; i++)
  130.                 {
  131.                     if (fullTextOfTables.ElementAt(i).Contains("\r"))
  132.                     {
  133.                         worksheet.Cells[cellRowIndex, cellColumnIndex] = fullTextOfTables.ElementAt(i);
  134.                         cellRowIndex++;
  135.                         cellColumnIndex = 1;
  136.                     }
  137.                     else
  138.                     {
  139.                         worksheet.Cells[cellRowIndex, cellColumnIndex] = fullTextOfTables.ElementAt(i);
  140.                         cellColumnIndex++;
  141.                     }
  142.                 }
  143.                 aRange.Columns.AutoFit();
  144.             }
  145.             catch (System.Exception ex)
  146.             {
  147.                 //MessageBox.Show(ex.Message);
  148.             }
  149.  
  150.  
  151.  
  152.             tableList.Clear();
  153.             fullTextOfTables.Clear();
  154.  
  155.         }
  156.     }
  157. }

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Если интересно, то я сделал вот так.
Обработка объекта после закрытия транзакции? И что, это работает?

Оффлайн Denis

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: Импорт данных объекта Table в файл EXCEL
« Ответ #10 : 01-08-2017, 22:47:35 »
В автокаде да, я этим пользуюсь. А вот в бриксе не катит.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Импорт данных объекта Table в файл EXCEL
« Ответ #11 : 01-08-2017, 22:51:45 »
В автокаде да, я этим пользуюсь.
Очень плохая манера, чреватая непредсказуемыми последствиями.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Denis

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: Импорт данных объекта Table в файл EXCEL
« Ответ #12 : 01-08-2017, 23:02:02 »
Исправлюсь. Начинал так, поэтому и повелось, но уже иногда получается уходить