using HotelPms.Share.Data; using HotelPms.Share.Util; using HotelPms.Share.Windows.Util; using NPOI.SS.UserModel; 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; namespace HotelPms.SourceFactory { public partial class TableToExcel : Form { public TableToExcel() { InitializeComponent(); } private void OpenExcel_Click(object sender, EventArgs e) { openFileDialog1.InitialDirectory = Application.StartupPath; if (openFileDialog1.ShowDialog() != DialogResult.OK) { return; } txtExcelPath.Text = openFileDialog1.FileName; cmbSheet.Items.Clear(); using (NPOIExcel excel = new NPOIExcel(txtExcelPath.Text)) { for (int i = 0; i < excel.Workbook.NumberOfSheets; i++) { cmbSheet.Items.Add(excel.Workbook.GetSheetAt(i).SheetName); } } } private void btnCopySheet_Click(object sender, EventArgs e) { using (NPOIExcel excel = new NPOIExcel(txtExcelPath.Text)) { ISheet sheet = excel.Workbook.GetSheetAt(excel.Workbook.GetSheetIndex(cmbSheet.SelectedItem.ToString())); sheet.CopyTo(excel.Workbook, txtNewSheet.Text, true, true); //2.5.2のNET5.0版にBUGがあって、keepFormulasを使えない 2.5.3でFixした //sheet.CopyTo(excel.Workbook, txtNewSheet.Text, true, false); excel.Save(); MessageBox.Show("OK"); } } private void btnOpenDB_Click(object sender, EventArgs e) { using (DataAccess dataAccess = new MsSqlNet(new DBConnectItem() { HostName = txtHost.Text, UserID = txtUser.Text, Password = txtPassword.Text, DBName = txtDB.Text })) { using (DataTable data = dataAccess.GetTableList()) { cmbTable.Items.Clear(); foreach(DataRow row in data.Rows) { cmbTable.Items.Add(row["Name"]); } if (cmbTable.Items.Count > 0) { cmbTable.SelectedIndex = 0; } } } } private void CopyPage(NPOIExcel excel, int beginRowdx, int pageRowCount) { int j = beginRowdx; for (int i = 0; i < pageRowCount; i++) { excel.Sheet.CopyRow(i, j); j++; } } private void SetTableToSheet(DataTable data, NPOIExcel excel, string sheetName) { excel.SetCurrentSheet(excel.Workbook.GetSheetIndex(sheetName)); int pageRowCount = 50; int pageNo = 1; int rowIdx = 7; foreach (DataRow row in data.Rows) { if (rowIdx % pageRowCount == 0) { //ページ最後の空行 pageNo++; //ページコピー if ((excel.Sheet.LastRowNum + 1) < pageNo * pageRowCount) { CopyPage(excel, rowIdx + 1, pageRowCount); } rowIdx += 7; } excel.SetCell($"G{rowIdx - 3}", sheetName); excel.SetCell($"AC{rowIdx - 2}", DateTime.Now.ToString("yyyy/MM/dd")); excel.SetCell($"D{rowIdx}", row["Field"].ToString()); //TableName int len = CConvert.ToInt(row["max_length"]); string type = row["type"].ToString().ToUpper(); if (type == "NVARCHAR") { len /= 2; } else if (type == "INT" || type == "DATETIME" || type == "SMALLDATETIME" || type == "SMALLINT" || type == "TINYINT" || type == "BIT") { len = -1; } string lenText = (len == -1 ? string.Empty : $"({len})"); excel.SetCell($"S{rowIdx}", $"{row["type"].ToString().ToUpper()}{lenText}"); //型(長さ) excel.SetCell($"X{rowIdx}", row["PKFlg"].ToString() == "1" ? "〇" : string.Empty); //PK rowIdx++; //次の行番号 } } private void button1_Click(object sender, EventArgs e) { if(cmbSheet.SelectedIndex == -1) { MessageBox.Show("シートを選んでください。"); cmbSheet.Focus(); return; } if (cmbTable.SelectedIndex == -1) { MessageBox.Show("テーブルを選んでください。"); cmbSheet.Focus(); return; } using (MsSqlNet dataAccess = new MsSqlNet(new DBConnectItem() { HostName = txtHost.Text, UserID = txtUser.Text, Password = txtPassword.Text, DBName = txtDB.Text })) { using (DataTable data = dataAccess.GetFieldList(cmbTable.SelectedItem.ToString())) { using (NPOIExcel excel = new NPOIExcel(txtExcelPath.Text)) { SetTableToSheet(data, excel, cmbSheet.SelectedItem.ToString()); excel.Save(); MessageBox.Show("OK"); } } } } private bool ExistsKey(string data, Dictionary keyDict) { if (keyDict.Count == 0) { return true; } foreach(KeyValuePair item in keyDict) { if (data.StartsWith(item.Key)) { return true; } } return false; } private void button2_Click(object sender, EventArgs e) { Dictionary keyDict = GetTableKey(); using (NPOIExcel excel = new NPOIExcel(txtExcelPath.Text)) { excel.SetCurrentSheet(excel.Workbook.GetSheetIndex("目次")); int rowIdx = 5; int i = 1; foreach (string item in cmbTable.Items) { if (!ExistsKey(item, keyDict)) { continue; } excel.SetCell($"D{rowIdx}", item); //TableName rowIdx++; i++; if (i == 52) { rowIdx += 5; i = 1; } } excel.Save(); MessageBox.Show("OK"); } } private Dictionary GetTableKey() { Dictionary keyDict = new Dictionary(); if (txtTableConditon.Text.Length > 0) { string[] condList = txtTableConditon.Text.Split(new char[] { ',' }); foreach (string key in condList) { keyDict.Add(key, 0); } } return keyDict; } private void button3_Click(object sender, EventArgs e) { if (cmbTable.Items.Count == 0) { MessageBox.Show("テーブル一覧がない。"); cmbSheet.Focus(); } Dictionary keyDict = GetTableKey(); using (MsSqlNet dataAccess = new MsSqlNet(new DBConnectItem() { HostName = txtHost.Text, UserID = txtUser.Text, Password = txtPassword.Text, DBName = txtDB.Text })) { using (NPOIExcel excel = new NPOIExcel(txtExcelPath.Text)) { int i = 0; foreach (string tableName in cmbTable.Items) { if (!ExistsKey(tableName, keyDict)) { continue; } using (DataTable data = dataAccess.GetFieldList(tableName)) { SetTableToSheet(data, excel, tableName); } i++; lblStatus.Text = i.ToString(); lblStatus.Refresh(); } excel.Save(); MessageBox.Show("OK"); } } } private void txtExcelPath_TextChanged(object sender, EventArgs e) { } private void cmbSheet_SelectedIndexChanged(object sender, EventArgs e) { } } }