using arUtil; using FarPoint.Win.Spread; using FCOMMON; using GrapeCity.CalcEngine; using Microsoft.Reporting.Map.WebForms.BingMaps; using NetOffice; using Outlook = NetOffice.OutlookApi; using NetOffice.OutlookApi.Enums; using NetOffice.OfficeApi; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using static System.Windows.Forms.VisualStyles.VisualStyleElement; using libxl; using FarPoint.Excel; namespace FEQ0000 { public partial class fUserExportColumn : Form { string presavefn = ""; //this.Name, cols,this.dsPurchase.Purchase,this.bs.Filter string Source = ""; dsPurchase.PurchaseDataTable dt; public fUserExportColumn(string source, Dictionary cols, DataTable dt_, string filter) { InitializeComponent(); this.StartPosition = FormStartPosition.CenterScreen; presavefn = Util.MakeFilePath("exportsetting", source); var prelists = ""; if (System.IO.File.Exists(presavefn)) prelists = System.IO.File.ReadAllText(presavefn, System.Text.Encoding.Default); // Dictionary preitems = new Dictionary(); this.listView2.Items.Clear(); this.listView1.FullRowSelect = true; this.listView1.CheckBoxes = true; Source = source; dt = new dsPurchase.PurchaseDataTable(); this.dt.Merge(dt_); this.bs.DataSource = dt; this.bs.Filter = filter; if (prelists.Length > 0) { var itemsbu = prelists.Split('\n'); foreach (var item in prelists.Split('\n')) { if (item.isEmpty()) continue; var items = item.Split('|'); var chk = items[0] == "1"; var field = items[1]; var title = items[2].Replace("\r", ""); var lv = listView2.Items.Add(title); lv.Tag = field; lv.Checked = chk; } } else { foreach (var item in cols) { var title = item.Value.Replace("\n", "").Replace("\r", ""); var lv = listView2.Items.Add(title); lv.Tag = item.Key; } } listView2.FullRowSelect = true; listView2.HideSelection = false; listView2.GridLines = true; listView2.MultiSelect = false; } private void button1_Click(object sender, EventArgs e) { // 선택된 아이템이 있고, 그것이 첫 번째 아이템이 아닌 경우에만 실행합니다. if (listView2.FocusedItem.Index > 0) { int currentIndex = listView2.FocusedItem.Index; ListViewItem currentItem = listView2.FocusedItem; // 이전 아이템과 위치를 바꿉니다. listView2.Items.RemoveAt(currentIndex); listView2.Items.Insert(currentIndex - 1, currentItem); // 위로 올리는 동작을 시각적으로 보여주기 위해 선택된 아이템을 변경합니다. currentItem.Selected = true; currentItem.Focused = true; } } private void button2_Click(object sender, EventArgs e) { if (listView2.FocusedItem.Index < listView2.Items.Count - 1) { int currentIndex = listView2.FocusedItem.Index; ListViewItem currentItem = listView2.FocusedItem; // 다음 아이템과 위치를 바꿉니다. listView2.Items.RemoveAt(currentIndex); listView2.Items.Insert(currentIndex + 1, currentItem); // 아래로 내리는 동작을 시각적으로 보여주기 위해 선택된 아이템을 변경합니다. currentItem.Selected = true; currentItem.Focused = true; } } private void toolStripButton1_Click(object sender, EventArgs e) { } private void fUserExportColumn_Load(object sender, EventArgs e) { button3.PerformClick(); } private void button3_Click(object sender, EventArgs e) { //rprewviwe var items = this.listView2.CheckedItems; SortedDictionary cols = new SortedDictionary(); var sb = new System.Text.StringBuilder(); foreach (ListViewItem lv in items) { var no = lv.Index; var field = lv.SubItems[0].Text + "|" + lv.Tag.ToString(); cols.Add(no, field); } foreach (ListViewItem lv in listView2.Items) { sb.AppendLine($"{(lv.Checked ? "1" : "0")}|{lv.Tag}|{lv.SubItems[0].Text}"); } var fi = new System.IO.FileInfo(presavefn); if (fi.Directory.Exists == false) fi.Directory.Create(); System.IO.File.WriteAllText(fi.FullName, sb.ToString(), System.Text.Encoding.Default); listView1.Clear(); listView1.Columns.Add("No"); foreach (var item in cols) { var titles = item.Value.Split('|'); listView1.Columns.Add(titles[0],titles[0]); } for (int i = 0; i < bs.Count; i++) { var drv = bs[i] as DataRowView; var no = this.listView1.Items.Count + 1; var lv = this.listView1.Items.Add(no.ToString()); lv.Checked = true; lv.Tag = string.Empty; var colno = -1; foreach (var item in cols) { colno += 1; var titles = item.Value.Split('|'); var field = titles[1]; var title = titles[0]; var val = drv[field]; var dr = drv.Row; var coldata = dr.Table.Columns[field]; if (coldata.DataType == typeof(int)) { if (val == null) lv.SubItems.Add("--"); else lv.SubItems.Add(((int)val).ToString("N0")); lv.Tag += "," + (colno+1).ToString(); } else if (coldata.DataType == typeof(decimal)) { if (val == null) lv.SubItems.Add("--"); else lv.SubItems.Add(((decimal)val).ToString("N0")); lv.Tag += "," + (colno + 1).ToString(); } else { if (val == null) lv.SubItems.Add(""); else lv.SubItems.Add(val.ToString()); } } } } List ChangeMailAddress(List userid) { var db = new DataClasses1DataContext(); List retval = new List(); foreach (var id in userid) { UInt32 userno; if (UInt32.TryParse(id, out userno) == true) { var user = db.Users.Where(t => t.id == id).FirstOrDefault(); if (user != null) { var data = string.Format("{0}<{1}>", user.name, user.email); if (retval.Contains(data) == false) retval.Add(data); } } else { if (retval.Contains(id) == false) retval.Add(id); } } return retval; } void save(string fn = "") { if (fn.isEmpty()) fn = (Util.MakeFilePath("temp", DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".xlsx")); var fi = new System.IO.FileInfo(fn); if (fi.Directory.Exists == false) fi.Directory.Create(); libxl.Book book;// = new libxl.BinBook(); book = new libxl.XmlBook(); book.setKey(FCOMMON.info.libxlCompany, FCOMMON.info.libxlKey); var sheet = book.addSheet("data"); var colno = 0; var rowno = 0; for (int i = 0; i < this.listView1.Columns.Count; i++) { var col = this.listView1.Columns[i]; sheet.writeStr(rowno, i, col.Text); } foreach (ListViewItem lv in this.listView1.CheckedItems) { rowno += 1; var tagstr = lv.Tag?.ToString() ?? string.Empty; var numcols = tagstr.Split(','); for (int i = 0; i < this.listView1.Columns.Count; i++) { var data = lv.SubItems[i].Text; if (i == 0) data = rowno.ToString(); if (numcols.Contains(i.ToString())) sheet.writeNum(rowno, i, double.Parse(data)); else sheet.writeStr(rowno, i, data); } } //sheet.siz book.save(fi.FullName); } private void toolStripButton3_Click(object sender, EventArgs e) { //데이터수집 if(listView1.CheckedItems.Count < 1) { Util.MsgE("선택된 대상이 없습니다"); return; } //현재표시데이터중에 수신자목록을 가져온다 var drows = (dsPurchase.PurchaseRow[])(this.dt.Select(this.bs.Filter, this.bs.Sort)); var grp_req = drows.Where(t => t.request.isEmpty() == false).GroupBy(t => t.request).Select(t => t.FirstOrDefault().request).ToList(); var grp_rec = drows.Where(t => t.receive.isEmpty() == false).GroupBy(t => t.receive).Select(t => t.FirstOrDefault().receive).ToList(); List tolist = new List(); //최종받는사람 List cclist = new List(); List bcclist = new List(); var fn = new System.IO.FileInfo(Util.MakeFilePath("mailform", this.Source + ".xml")); if (fn.Directory.Exists == false) fn.Directory.Create(); var xml = new XMLHelper(fn.FullName); string form_subject, form_body, form_to, form_cc, form_bcc; form_subject = form_body = form_to = form_cc = form_bcc = ""; form_subject = xml.get_Data("subject"); form_body = xml.get_Data("body"); form_to = xml.get_Data("to"); form_cc = xml.get_Data("cc"); if (form_cc.isEmpty()) form_cc = "{요청}"; form_bcc = xml.get_Data("bcc"); var f = new Purchase.fMailForm(form_subject, form_body, form_to, form_cc, form_bcc); if (f.ShowDialog() != DialogResult.OK) return; //받는사람 if (form_to.Contains("{요청}") == true) tolist.AddRange(grp_req); if (form_to.Contains("{수령}") == true) tolist.AddRange(grp_rec); form_to = form_to.Replace("{요청}", ""); form_to = form_to.Replace("{수령}", ""); tolist.AddRange(form_to.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)); tolist = ChangeMailAddress(tolist); //참조 if (form_cc.Contains("{요청}") == true) cclist.AddRange(grp_req); if (form_cc.Contains("{수령}") == true) cclist.AddRange(grp_rec); form_cc = form_cc.Replace("{요청}", ""); form_cc = form_cc.Replace("{수령}", ""); cclist.AddRange(form_cc.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)); cclist = ChangeMailAddress(cclist); //숨은참조 if (form_bcc.Contains("{요청}") == true) bcclist.AddRange(grp_req); if (form_bcc.Contains("{수령}") == true) bcclist.AddRange(grp_rec); form_bcc = form_bcc.Replace("{요청}", ""); form_bcc = form_bcc.Replace("{수령}", ""); bcclist.AddRange(form_bcc.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)); bcclist = ChangeMailAddress(bcclist); form_subject = f.tbSubject.Text.Trim(); form_body = f.htmlEditor1.Html; form_to = f.tbTo.Text.Trim(); form_cc = f.tbCC.Text.Trim(); form_bcc = f.tbBcc.Text.Trim(); xml.set_Data("subject", form_subject); xml.set_Data("body", form_body); xml.set_Data("to", form_to); xml.set_Data("cc", form_cc); xml.set_Data("bcc", form_bcc); xml.Save(); //받는사람 if (form_to.Contains("{요청}") == true) tolist.AddRange(grp_req); if (form_to.Contains("{수령}") == true) tolist.AddRange(grp_rec); form_to = form_to.Replace("{요청}", ""); form_to = form_to.Replace("{수령}", ""); tolist.AddRange(form_to.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)); tolist = ChangeMailAddress(tolist); //참조 if (form_cc.Contains("{요청}") == true) cclist.AddRange(grp_req); if (form_cc.Contains("{수령}") == true) cclist.AddRange(grp_rec); form_cc = form_cc.Replace("{요청}", ""); form_cc = form_cc.Replace("{수령}", ""); cclist.AddRange(form_cc.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)); cclist = ChangeMailAddress(cclist); //숨은참조 if (form_bcc.Contains("{요청}") == true) bcclist.AddRange(grp_req); if (form_bcc.Contains("{수령}") == true) bcclist.AddRange(grp_rec); form_bcc = form_bcc.Replace("{요청}", ""); form_bcc = form_bcc.Replace("{수령}", ""); bcclist.AddRange(form_bcc.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)); bcclist = ChangeMailAddress(bcclist); //form_subject = form_subject.Replace("{DATE}", datestr); try { Outlook.Application outlookApplication = new Outlook.Application(); var newMail = outlookApplication.CreateItem(OlItemType.olMailItem) as Outlook.MailItem; newMail.Display(); newMail.Subject = form_subject; // this.tbSubject.Text.Trim(); // dr.title; newMail.To = string.Join(";", tolist.ToArray()); newMail.CC = string.Join(";", cclist.ToArray()); newMail.BCC = string.Join(";", bcclist.ToArray()); if (f.chkAttach.Checked) { var fi = new System.IO.FileInfo(FCOMMON.Util.CurrentPath + "\\Export\\Purchase_" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".xls"); if (fi.Directory.Exists == false) fi.Directory.Create(); ///save file save(fi.FullName); newMail.Attachments.Add(fi.FullName); } if (f.chkList.Checked) { //목록을 본문에 추가한다 System.Text.StringBuilder sb = new StringBuilder(); sb.AppendLine(""); sb.AppendLine(""); for (int i = 0; i < this.listView1.Columns.Count; i++) { var col = this.listView1.Columns[i]; sb.AppendLine($""); } sb.AppendLine(""); sb.AppendLine(""); var row = 1; foreach (ListViewItem lv in this.listView1.CheckedItems) { sb.AppendLine(""); for (int i = 0; i < this.listView1.Columns.Count; i++) { var data = lv.SubItems[i].Text; var txt = i == 0 ? (row).ToString() : data; sb.AppendLine($""); } sb.AppendLine(""); row += 1; } sb.AppendLine(""); sb.AppendLine("
{col.Text}
{txt}
"); form_body += sb.ToString(); } //newMail.BodyFormat = OlBodyFormat.olFormatHTML; //form_body = form_body.Replace("{DATE}", datestr); newMail.HTMLBody = form_body + newMail.HTMLBody; // } catch (System.Exception ex) { Util.MsgE("전송실패\n\n" + ex.Message + "\n\n" + "아웃룩의 설정이 정상인지 확인하세요"); } } private void toolStripButton2_Click(object sender, EventArgs e) { if (listView1.CheckedItems.Count < 1) { Util.MsgE("선택된 대상이 없습니다"); return; } var sd = new SaveFileDialog(); sd.Filter = "xlsx|*.xlsx"; if (sd.ShowDialog() != DialogResult.OK) return; save(sd.FileName); Util.RunExplorer(sd.FileName); } private void panel1_Paint(object sender, PaintEventArgs e) { } private void toolStripButton4_Click(object sender, EventArgs e) { foreach (ListViewItem lv in this.listView1.Items) lv.Checked = true; } private void toolStripButton5_Click(object sender, EventArgs e) { foreach (ListViewItem lv in this.listView1.Items) lv.Checked = !lv.Checked; } private void toolStripButton6_Click(object sender, EventArgs e) { foreach (ListViewItem lv in this.listView1.Items) lv.Checked = false; } private void button4_Click(object sender, EventArgs e) { var lv = this.listView2.FocusedItem; if (lv == null) { Util.MsgE("필터를 적용할 컬럼을 좌측에서 선택하세요"); return; } if(lv.Checked ==false) { Util.MsgE("선택된 열이 아닙니다. 필터는 선택된 열만 가능합니다"); return; } var f = new fColumnFilter(lv.SubItems[0].Text); if (f.ShowDialog() != DialogResult.OK) return; var 조건 = f.comboBox1.Text; var 값 = f.textBox1.Text; var 체크 = f.checkBox1.Checked; var col = listView1.Columns[lv.SubItems[0].Text]; foreach(ListViewItem item in this.listView1.Items) { var curvalue = item.SubItems[col.Index].Text; if(curvalue.Equals(값)) { item.Checked = 체크; item.ForeColor = 체크 ? System.Drawing.Color.Blue : System.Drawing.Color.DimGray; } } } } }