408 lines
15 KiB
C#
408 lines
15 KiB
C#
using Autodesk.Revit.DB;
|
|
using KDCS.Utils;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
using Excel = Microsoft.Office.Interop.Excel;
|
|
|
|
|
|
namespace KMBIM
|
|
{
|
|
public partial class ExcelExport : System.Windows.Forms.Form
|
|
{
|
|
public Autodesk.Revit.DB.Document doc = null; // Store the reference of the application in revit
|
|
Microsoft.Office.Interop.Excel.Application excelApp = null;
|
|
|
|
Excel.Workbook workbook = null;
|
|
public ExcelExport()
|
|
{
|
|
InitializeComponent();
|
|
|
|
}
|
|
public ExcelExport(Autodesk.Revit.DB.Document revit_db)
|
|
{
|
|
InitializeComponent();
|
|
doc = revit_db;
|
|
}
|
|
|
|
private void Form1_Load(object sender, EventArgs e)
|
|
{
|
|
this.KeyPreview = true;
|
|
|
|
tbPath.Text = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\" + doc.Title + ".xlsx";
|
|
FilteredElementCollector collector = new FilteredElementCollector(doc);
|
|
IList<Element> collection = collector.OfClass(typeof(ViewSchedule)).ToElements();
|
|
|
|
ViewScheduleExportOptions op = new ViewScheduleExportOptions();
|
|
|
|
foreach (Element el in collection)
|
|
{
|
|
ViewSchedule viewSchedule = el as ViewSchedule;
|
|
|
|
if (!viewSchedule.IsTitleblockRevisionSchedule)
|
|
listBox1.Items.Add(viewSchedule.Name);
|
|
}
|
|
}
|
|
public void getScheduleData(Document doc)
|
|
{
|
|
FilteredElementCollector collector = new FilteredElementCollector(doc);
|
|
IList<Element> collection = collector.OfClass(typeof(ViewSchedule)).ToElements();
|
|
|
|
String prompt = "ScheduleData :";
|
|
prompt += Environment.NewLine;
|
|
|
|
foreach (Element e in collection)
|
|
{
|
|
ViewSchedule viewSchedule = e as ViewSchedule;
|
|
TableData table = viewSchedule.GetTableData();
|
|
TableSectionData section = table.GetSectionData(SectionType.Body);
|
|
int nRows = section.NumberOfRows;
|
|
int nColumns = section.NumberOfColumns;
|
|
|
|
if (nRows > 1)
|
|
{
|
|
// valueData.Add(viewSchedule.Name);
|
|
|
|
List<List<string>> scheduleData = new List<List<string>>();
|
|
for (int i = 0; i < nRows; i++)
|
|
{
|
|
List<string> rowData = new List<string>();
|
|
|
|
for (int j = 0; j < nColumns; j++)
|
|
{
|
|
rowData.Add(viewSchedule.GetCellText(SectionType.Body, i, j));
|
|
|
|
}
|
|
scheduleData.Add(rowData);
|
|
}
|
|
|
|
List<string> columnData = scheduleData[0];
|
|
scheduleData.RemoveAt(0);
|
|
|
|
DataMapping(columnData, scheduleData);
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void DataMapping(List<string> keyData, List<List<string>> valueData)
|
|
{
|
|
List<Dictionary<string, string>> items = new List<Dictionary<string, string>>();
|
|
|
|
string prompt = "Key/Value";
|
|
prompt += Environment.NewLine;
|
|
|
|
foreach (List<string> list in valueData)
|
|
{
|
|
for (int key = 0, value = 0; key < keyData.Count && value < list.Count; key++, value++)
|
|
{
|
|
Dictionary<string, string> newItem = new Dictionary<string, string>();
|
|
|
|
string k = keyData[key];
|
|
string v = list[value];
|
|
newItem.Add(k, v);
|
|
items.Add(newItem);
|
|
}
|
|
}
|
|
|
|
foreach (Dictionary<string, string> item in items)
|
|
{
|
|
foreach (KeyValuePair<string, string> kvp in item)
|
|
{
|
|
prompt += "Key: " + kvp.Key + ",Value: " + kvp.Value;
|
|
prompt += Environment.NewLine;
|
|
}
|
|
}
|
|
|
|
Autodesk.Revit.UI.TaskDialog.Show("Revit", prompt);
|
|
}
|
|
#region 버튼 기능
|
|
private void button2_Click(object sender, EventArgs e)
|
|
{
|
|
|
|
foreach (var item in listBox1.SelectedItems)
|
|
{
|
|
listBox2.Items.Add(item.ToString());
|
|
}
|
|
for (int i = 0; i < listBox2.Items.Count; i++)
|
|
{
|
|
listBox1.Items.Remove(listBox2.Items[i].ToString());
|
|
}
|
|
|
|
|
|
}
|
|
|
|
private void button3_Click(object sender, EventArgs e)
|
|
{
|
|
foreach (var item in listBox2.SelectedItems)
|
|
{
|
|
listBox1.Items.Add(item.ToString());
|
|
}
|
|
for (int i = 0; i < listBox1.Items.Count; i++)
|
|
{
|
|
listBox2.Items.Remove(listBox1.Items[i].ToString());
|
|
}
|
|
}
|
|
|
|
private void button1_Click(object sender, EventArgs e)
|
|
{
|
|
for (int i = 0; i < listBox1.Items.Count; i++)
|
|
{
|
|
listBox2.Items.Add(listBox1.Items[i].ToString());
|
|
}
|
|
listBox1.Items.Clear();
|
|
|
|
}
|
|
|
|
private void button4_Click(object sender, EventArgs e)
|
|
{
|
|
for (int i = 0; i < listBox2.Items.Count; i++)
|
|
{
|
|
listBox1.Items.Add(listBox2.Items[i].ToString());
|
|
}
|
|
listBox2.Items.Clear();
|
|
}
|
|
#endregion
|
|
public void partExport(ViewSchedule schedule, SectionType type, Excel.Worksheet sheet, ref int nRow)
|
|
{
|
|
TableData table = schedule.GetTableData();
|
|
TableSectionData section = table.GetSectionData(type);
|
|
if (section == null) return;
|
|
int nRows = section.NumberOfRows;
|
|
|
|
int nColumns = section.NumberOfColumns;
|
|
if (nRows > 0)
|
|
{
|
|
for (int i = 0; i < nRows; i++)
|
|
{
|
|
List<string> rowData = new List<string>();
|
|
|
|
for (int j = 0; j < nColumns; j++)
|
|
{
|
|
TableCellStyle style = section.GetTableCellStyle(i, j);
|
|
TableMergedCell mergecell = section.GetMergedCell(i, j);
|
|
TableCellCalculatedValueData v = section.GetCellCalculatedValue(i, j);
|
|
FormatOptions f = section.GetCellFormatOptions(i, j, doc);
|
|
|
|
|
|
rowData.Add(schedule.GetCellText(type, i, j));
|
|
string strvalue = schedule.GetCellText(type, i, j);
|
|
var cell = sheet.Cells[i + nRow, j + 1] as Excel.Range;
|
|
// cell.Interior.Color = System.Drawing.Color.FromArgb(1,style.BackgroundColor.Red, style.BackgroundColor.Green, style.BackgroundColor.Blue);
|
|
cell.Value = strvalue;
|
|
cell.EntireColumn.ColumnWidth = Unit.FeetToMM(section.GetColumnWidth(j));
|
|
|
|
}
|
|
|
|
}
|
|
if (type == SectionType.Body)
|
|
{
|
|
Excel.Range oRng1 = (Excel.Range)sheet.Cells[nRow, 1];
|
|
// point two is the bottom, rightmost cell
|
|
Excel.Range oRng2 = (Excel.Range)sheet.Cells[nRow + nRows, nColumns];
|
|
|
|
// define the actual range we want to select
|
|
var oRng = sheet.Range[oRng1, oRng2];
|
|
oRng.Select(); // and select it
|
|
oRng.Select(); // and select it
|
|
oRng.Worksheet.ListObjects.AddEx(SourceType: Excel.XlListObjectSourceType.xlSrcRange, Source: oRng, XlListObjectHasHeaders: Excel.XlYesNoGuess.xlNo);
|
|
}
|
|
nRow += nRows - 1;
|
|
}
|
|
|
|
}
|
|
private void btn_export_Click(object sender, EventArgs e)
|
|
{
|
|
if (tbPath.Text == "") { MessageBox.Show("엑셀 파일 경로 지정후 다시 시도하시기 바랍니다."); return; }
|
|
string excelFile = tbPath.Text;
|
|
|
|
|
|
FilteredElementCollector collector = new FilteredElementCollector(doc);
|
|
IList<Element> collection = collector.OfClass(typeof(ViewSchedule)).ToElements();
|
|
try
|
|
{
|
|
if (collection.Count > 0)
|
|
{
|
|
//일람표가 하나라도 있으면 엑셀 오픈 하기
|
|
|
|
if (radioButton1.Checked)
|
|
{
|
|
excelApp = new Microsoft.Office.Interop.Excel.Application();
|
|
excelApp.Visible = false;
|
|
//workbook = (Workbook)(excelApp.Workbooks.Add(System.Reflection.Missing.Value));
|
|
workbook = excelApp.Workbooks.Add();
|
|
}
|
|
|
|
|
|
}
|
|
else
|
|
{
|
|
//하나라도 없으면 일람표가 없다고 메시지 보여주고 끝내기
|
|
MessageBox.Show("일람표가 존재하지 않습니다. \n 기능을 종료합니다."); return;
|
|
}
|
|
|
|
for (int z = 0; z < listBox2.Items.Count; z++)
|
|
{
|
|
if (radioButton2.Checked)
|
|
{
|
|
excelApp = new Microsoft.Office.Interop.Excel.Application();
|
|
excelApp.Visible = false;
|
|
workbook = excelApp.Workbooks.Add();
|
|
}
|
|
string sheet_name = listBox2.Items[z].ToString();
|
|
ViewSchedule viewSchedule = null;
|
|
|
|
foreach (Element el in collection)
|
|
{
|
|
if (el.Name.CompareTo(sheet_name) != 0)
|
|
{
|
|
continue;
|
|
}
|
|
viewSchedule = el as ViewSchedule;
|
|
break;
|
|
|
|
}
|
|
|
|
Excel.Worksheet sheet1 = null;
|
|
if (viewSchedule != null)
|
|
{
|
|
sheet1 = (Excel.Worksheet)workbook.Worksheets.Add(Type.Missing); //기본 시트 후에 생성
|
|
|
|
sheet1.Name = viewSchedule.Name;
|
|
|
|
|
|
// sheet1.Columns.AutoFit();
|
|
}
|
|
int nRow = 1;
|
|
//헤더파트
|
|
partExport(viewSchedule, SectionType.Header, sheet1, ref nRow);
|
|
//서머리 파트
|
|
partExport(viewSchedule, SectionType.Summary, sheet1, ref nRow);
|
|
//바디파트
|
|
partExport(viewSchedule, SectionType.Body, sheet1, ref nRow);
|
|
partExport(viewSchedule, SectionType.Footer, sheet1, ref nRow);
|
|
if (radioButton2.Checked == true)
|
|
{ //엑셀 끝내기
|
|
|
|
string dir = System.IO.Path.GetDirectoryName(tbPath.Text);
|
|
string file = System.IO.Path.GetFileNameWithoutExtension(tbPath.Text);
|
|
string ext = System.IO.Path.GetExtension(tbPath.Text);
|
|
string filename = sheet1.Name + ext;
|
|
excelFile = System.IO.Path.Combine(dir, filename);
|
|
|
|
workbook.SaveAs(excelFile);
|
|
workbook.Close(true);
|
|
excelApp.Quit();
|
|
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
|
|
excelApp = null;
|
|
workbook = null;
|
|
System.GC.Collect();
|
|
GC.WaitForPendingFinalizers();
|
|
}
|
|
}
|
|
if (radioButton1.Checked == true)
|
|
{
|
|
//엑셀 끝내기
|
|
workbook.SaveAs(excelFile);
|
|
try
|
|
{
|
|
workbook.Close(true);
|
|
}
|
|
catch
|
|
{
|
|
|
|
}
|
|
excelApp.Quit();
|
|
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
|
|
excelApp = null;
|
|
workbook = null;
|
|
System.GC.Collect();
|
|
GC.WaitForPendingFinalizers();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
// workbook.Close(true);
|
|
|
|
string msg = "Error:Could not open worksheet in " + ": " + ex.Message;
|
|
excelApp.Quit();
|
|
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
|
|
excelApp = null;
|
|
workbook = null;
|
|
System.GC.Collect();
|
|
GC.WaitForPendingFinalizers();
|
|
throw new Exception(msg);
|
|
|
|
}
|
|
this.Close();
|
|
}
|
|
|
|
private void btnPath_Click(object sender, EventArgs e)
|
|
{
|
|
SaveFileDialog saveFileDialog1 = new SaveFileDialog();
|
|
saveFileDialog1.Filter = "Excel Files(*.xlsx)|*.xlsx";
|
|
saveFileDialog1.FilterIndex = 2;
|
|
saveFileDialog1.RestoreDirectory = true;
|
|
|
|
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
|
|
{
|
|
tbPath.Text = saveFileDialog1.FileName;
|
|
}
|
|
|
|
// FolderBrowserDialog dialog = new FolderBrowserDialog();
|
|
// dialog.ShowDialog();
|
|
// tbPath.Text = dialog.SelectedPath;
|
|
}
|
|
|
|
private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
|
|
{
|
|
if (listBox1.Items.Count > 0)
|
|
{
|
|
e.DrawBackground();
|
|
|
|
StringFormat sf = new StringFormat();
|
|
sf.LineAlignment = StringAlignment.Center;
|
|
sf.Alignment = StringAlignment.Near;
|
|
|
|
e.Graphics.DrawString(this.listBox1.Items[e.Index].ToString(),
|
|
e.Font, Brushes.Black, e.Bounds, sf);
|
|
e.DrawFocusRectangle();
|
|
}
|
|
}
|
|
|
|
private void listBox2_DrawItem(object sender, DrawItemEventArgs e)
|
|
{
|
|
if(listBox2.Items.Count > 0)
|
|
{
|
|
e.DrawBackground();
|
|
|
|
StringFormat sf = new StringFormat();
|
|
sf.LineAlignment = StringAlignment.Center;
|
|
sf.Alignment = StringAlignment.Near;
|
|
|
|
e.Graphics.DrawString(this.listBox2.Items[e.Index].ToString(),
|
|
e.Font, Brushes.Black, e.Bounds, sf);
|
|
e.DrawFocusRectangle();
|
|
}
|
|
}
|
|
|
|
private void ExcelExport_KeyDown(object sender, KeyEventArgs e)
|
|
{
|
|
if (e.KeyCode == Keys.Escape)
|
|
{
|
|
this.DialogResult = DialogResult.Cancel;
|
|
}
|
|
else if (e.KeyCode == Keys.Enter)
|
|
{
|
|
this.DialogResult = DialogResult.OK;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|