using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
namespace ExportTables
{
public class MainClass
{
static List<Table> tableList = new List<Table>();
static List<String> fullTextOfTables = new List<String>();
[CommandMethod("ExportTables")]
public void ExportTables()
{
//Определение документа.
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
DocumentCollection dm = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager;
Editor ed = dm.MdiActiveDocument.Editor;
// Запрос на выбор блоков
PromptSelectionOptions opts1 = new PromptSelectionOptions();
opts1.MessageForAdding = "Выберите все необходимые таблицы";
PromptSelectionResult acSSPrompt = doc.Editor.GetSelection(opts1);
if (acSSPrompt.Status != PromptStatus.OK)
{
ed.WriteMessage("Операция прервана пользователем\n");
return;
}
DBObjectCollection acDBObjColl = new DBObjectCollection();
using (Transaction atr = doc.TransactionManager.StartTransaction())
{
BlockTable bt = atr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
BlockTableRecord btr = atr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
// Проверка статуса и того, что мы выбрали что-то
if (acSSPrompt.Status == PromptStatus.OK)
{
SelectionSet acSSet = acSSPrompt.Value;
// Проходим по каждому блоку из выбранных
foreach (SelectedObject acSSObj in acSSet)
{
// Проверяем, что есть выбранный элемент.
if (acSSObj != null)
{
Entity ent = (Entity)atr.GetObject(acSSObj.ObjectId, OpenMode.ForWrite);
if (ent is Table)
{
Table tb = (Table)ent;
tableList.Add(tb);
}
}
}
}
atr.Commit();
}
//Экспорт всех таблиц.В конце строчки добавляем \r
foreach (Table tb in tableList)
{
for (int i = 0; i < tb.Rows.Count; i++)
{
for (int j = 0; j < tb.Columns.Count; j++)
{
if (j == tb.Columns.Count - 1)
{
string text = tb.Cells[i, j].TextString;
try
{
String textReturn = text.Split(';').ElementAt(1).Split('\\').ElementAt(0);
fullTextOfTables.Add(textReturn + "\r");
}
catch (ArgumentOutOfRangeException ex)
{
fullTextOfTables.Add(tb.Cells[i, j].TextString + "\r");
}
}
else
{
string text = tb.Cells[i, j].TextString;
try
{
String textReturn = text.Split(';').ElementAt(1).Split('\\').ElementAt(0);
fullTextOfTables.Add(textReturn);
}
catch (ArgumentOutOfRangeException ex)
{
fullTextOfTables.Add(tb.Cells[i, j].TextString);
}
}
}
}
}
//Вывод всех данных в Эксель.
Microsoft.Office.Interop.Excel._Application excel = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel._Workbook workbook = excel.Workbooks.Add(Type.Missing);
Microsoft.Office.Interop.Excel._Worksheet worksheet = null;
Microsoft.Office.Interop.Excel.Range aRange;
Microsoft.Office.Interop.Excel.Borders _borders;
try
{
worksheet = workbook.ActiveSheet;
worksheet.Name = "Exported";
excel.Visible = true;
int cellRowIndex = 1;
int cellColumnIndex = 1;
aRange = worksheet.get_Range("A1", "F" + (fullTextOfTables.Select(o => o.Contains("\r")).Count()).ToString());
//Проходим по всем строкам и столбцам.
for (int i = 0; i < fullTextOfTables.Count; i++)
{
if (fullTextOfTables.ElementAt(i).Contains("\r"))
{
worksheet.Cells[cellRowIndex, cellColumnIndex] = fullTextOfTables.ElementAt(i);
cellRowIndex++;
cellColumnIndex = 1;
}
else
{
worksheet.Cells[cellRowIndex, cellColumnIndex] = fullTextOfTables.ElementAt(i);
cellColumnIndex++;
}
}
aRange.Columns.AutoFit();
}
catch (System.Exception ex)
{
//MessageBox.Show(ex.Message);
}
tableList.Clear();
fullTextOfTables.Clear();
}
}
}