Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Алексей (IdeaSoft) от 31-07-2017, 13:12:25

Название: Импорт данных объекта Table в файл EXCEL
Отправлено: Алексей (IdeaSoft) от 31-07-2017, 13:12:25
Есть объект Autodesk.AutoCAD.DatabaseServices.Table
Необходимо перенести содержимое таблицы в Excel.

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

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

 
Название: Re: Импорт данных объекта Table в файл EXCEL
Отправлено: Алексей (IdeaSoft) от 31-07-2017, 13:30:26
Или думаю вот еще вариант.
Наверно так будет лучше, если
сделать через OLE

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

Или может есть готовое решение,
которое содержимое Table заносит в OLE?
Название: Re: Импорт данных объекта Table в файл EXCEL
Отправлено: Александр Ривилис от 31-07-2017, 13:49:38
Или думаю вот еще вариант.
Наверно так будет лучше, если
сделать через OLE

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

Или может есть готовое решение,
которое содержимое Table заносит в OLE?
Причем здесь OLE?
Название: Re: Импорт данных объекта Table в файл EXCEL
Отправлено: Александр Ривилис от 31-07-2017, 13:55:06
Необходимо перенести содержимое таблицы в 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
Название: Re: Импорт данных объекта Table в файл EXCEL
Отправлено: Алексей (IdeaSoft) от 31-07-2017, 14:11:29
А есть аналогичное решение через API
вместо командной строки?
_TABLEEXPORT
Название: Re: Импорт данных объекта Table в файл EXCEL
Отправлено: Александр Ривилис от 31-07-2017, 14:17:25
А есть аналогичное решение через API
вместо командной строки?
_TABLEEXPORT
Готового в API метода нет. Так что нужно писать самому.
Название: Re: Импорт данных объекта Table в файл EXCEL
Отправлено: Александр Ривилис от 31-07-2017, 14:20:00
Можешь посмотреть этот пример: http://through-the-interface.typepad.com/through_the_interface/2014/02/exporting-an-autocad-table-to-a-unicode-csv-using-net.html
Название: Re: Импорт данных объекта Table в файл EXCEL
Отправлено: Алексей (IdeaSoft) от 31-07-2017, 17:43:59
Спасибо за ответы!

Сделат так.
Особых требований к оформлению листов 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

Название: Re: Импорт данных объекта Table в файл EXCEL
Отправлено: Denis от 01-08-2017, 17:15:55
Если интересно, то я сделал вот так. Делал для случая, когда пользователь сам выбирает таблицы, которые ему нужно экспортить.
На выходе просто открывался 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. }
Название: Re: Импорт данных объекта Table в файл EXCEL
Отправлено: Дмитрий Загорулькин от 01-08-2017, 21:31:45
Если интересно, то я сделал вот так.
Обработка объекта после закрытия транзакции? И что, это работает?
Название: Re: Импорт данных объекта Table в файл EXCEL
Отправлено: Denis от 01-08-2017, 22:47:35
В автокаде да, я этим пользуюсь. А вот в бриксе не катит.
Название: Re: Импорт данных объекта Table в файл EXCEL
Отправлено: Александр Ривилис от 01-08-2017, 22:51:45
В автокаде да, я этим пользуюсь.
Очень плохая манера, чреватая непредсказуемыми последствиями.
Название: Re: Импорт данных объекта Table в файл EXCEL
Отправлено: Denis от 01-08-2017, 23:02:02
Исправлюсь. Начинал так, поэтому и повелось, но уже иногда получается уходить