using System; using System.Collections.Generic; using System.Data; using System.Data.OleDb; using System.IO; using System.Linq; using System.Windows; using ExportExcelTest.Models; using GeologyToolkit; using Microsoft.Win32; using NPOI.SS.UserModel; using NPOI.SS.Util; using NPOI.XSSF.UserModel; namespace ExportExcelTest { /// /// MainWindow.xaml 的交互逻辑 /// public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void CreateCell(IRow row, int column, object value) { var cell = row.CreateCell(column); if (value is int intValue) { cell.SetCellValue(intValue); } if (value is double doubleValue) { cell.SetCellValue(doubleValue); } else if (value is string stringValue) { cell.SetCellValue(stringValue); } else { cell.SetCellValue(value.ToString()); } } private static ICellStyle CreateCellStyle(IWorkbook workbook) { // 创建一个新的单元格样式 var style = workbook.CreateCellStyle(); // 创建一个新的字体样式 var font = workbook.CreateFont(); // 设置字体为 font.FontName = "宋体"; // 设置字体为加粗 //font.IsBold = true; // 设置字体颜色为白色 //font.Color = IndexedColors.Black.Index; // 将创建的字体样式应用到单元格样式中 style.SetFont(font); // 设置单元格填充前景色为蓝色 //style.FillForegroundColor = IndexedColors.Blue.Index; // 设置填充模式为实心 //style.FillPattern = FillPattern.SolidForeground; // 设置上边框为细线样式 style.BorderTop = BorderStyle.Thin; // 设置下边框为细线样式 style.BorderBottom = BorderStyle.Thin; // 设置左边框为细线样式 style.BorderLeft = BorderStyle.Thin; // 设置右边框为细线样式 style.BorderRight = BorderStyle.Thin; style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center; // 添加水平居中 // 设置垂直对齐方式为居中 style.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center; return style; } private static ICellStyle CreateHeaderStyle(IWorkbook workbook) { ICellStyle headerStyle = workbook.CreateCellStyle(); headerStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center; headerStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center; headerStyle.BorderBottom = BorderStyle.Thin; headerStyle.BorderTop = BorderStyle.Thin; headerStyle.BorderLeft = BorderStyle.Thin; headerStyle.BorderRight = BorderStyle.Thin; IFont font = workbook.CreateFont(); font.FontName = "宋体"; font.IsBold = true; font.FontHeightInPoints = 11; headerStyle.SetFont(font); return headerStyle; } //创建数据示例 private SheetTable CreateSampleData(TypeOfSurrounding surrounding) { var st = new SheetTable(surrounding); //一级开项 var kw = st.AddMain("开挖"); //二级开项 var tf = kw.AddSub("土方"); //细项 var pt = tf.AddDetail("普通开挖"); //计量方式,计量单位 pt.AddMeature(MeasurementUnit.Kilonewton).SetProof(0, 45.463).SetProof(4, 481.95); pt.AddMeature(MeasurementUnit.Kilogram).SetProof(1, 48.596).SetProof(3, 78.894); //细项 var jx = tf.AddDetail("机械开挖"); //计量方式,计量单位 jx.AddMeature(MeasurementUnit.Kilonewton).SetProof(0, 78.562).SetProof(5, 484.89); //二级开项及细项 var sf = kw.AddSub("石方").AddDetail("爆破开挖"); //计量方式,计量单位 sf.AddMeature(MeasurementUnit.Kilonewton).SetProof(0, 487.84).SetProof(6, 15.6); sf.AddMeature(MeasurementUnit.Kilogram).SetProof(1, 153.26).SetProof(3, 48.596); var cqwg = st.AddMain("衬砌圬工"); var ec = cqwg.AddSub("二衬"); var c30 = ec.AddDetail("C30钢筋砼"); c30.AddMeature(MeasurementUnit.Kilonewton).SetProof(0, 48.596).SetProof(3, 78.894); c30.AddMeature(MeasurementUnit.Kilonewton).SetProof(2, 48.6).SetProof(4, 78.894); var c30F = ec.AddDetail("C30钢筋砼 防水型"); c30F.AddMeature(MeasurementUnit.Kilonewton).SetProof(0, 48.596).SetProof(3, 78.894); c30F.AddMeature(MeasurementUnit.CubicMeter).SetProof(2, 48.6).SetProof(4, 78.894); var c40 = ec.AddDetail("C40钢筋砼"); c40.AddMeature(MeasurementUnit.Kilonewton).SetProof(1, 48.596).SetProof(3, 78.894); return st; } private void CreateSheetTitle(ISheet sheet, Measurement measurement) { var proofs = measurement.Proofs; TypeOfSurrounding typeOfSurrounding = measurement.Detail.SubItem.Primary.Table.TypeOfSurrounding; // 创建字体和样式 var workbook = sheet.Workbook; var style = CreateHeaderStyle(workbook); // 创建第一行(合并行) IRow row0 = sheet.CreateRow(0); string[] headerTitles = { "项目及建议材料说明", "单位", "支护类型", $"{typeOfSurrounding.GetDescription()}合计", $"TC-300-围岩类型:{typeOfSurrounding.GetDescription()}", "BIM算量规则", "备注及说明" }; //项目及建议材料说明 sheet.AddMergedRegion(new CellRangeAddress(0, 1, 0, 2)); CreateCell(row0, 0, headerTitles[0]); //单位 sheet.AddMergedRegion(new CellRangeAddress(0, 1, 3, 3)); CreateCell(row0, 3, headerTitles[1]); // 支护类型合并水平方向(跨proofs.Count列) sheet.AddMergedRegion(new CellRangeAddress(0, 0, 4, proofs.Count + 3)); CreateCell(row0, 4, headerTitles[2]); IRow row1 = sheet.CreateRow(1); for (int i = 0; i < proofs.Count; i++) { var item = proofs.ElementAt(i); CreateCell(row1, i + 4, item.TypeOfSupport); } //合计 sheet.AddMergedRegion(new CellRangeAddress(0, 1, proofs.Count + 4, proofs.Count + 4)); CreateCell(row0, proofs.Count + 4, headerTitles[3]); //围岩类型 sheet.AddMergedRegion(new CellRangeAddress(0, 0, proofs.Count + 5, proofs.Count + 6)); CreateCell(row0, proofs.Count + 5, headerTitles[4]); //BIM算量规则及描述 CreateCell(row1, proofs.Count + 5, headerTitles[5]); CreateCell(row1, proofs.Count + 6, headerTitles[6]); for (int i = 0; i < 2; i++) { IRow row = sheet.GetRow(i); for (int j = 0; j < measurement.Proofs.Count + 7; j++) { ICell cell = row.GetCell(j) ?? row.CreateCell(j); cell.CellStyle = style; sheet.AutoSizeColumn(j); } } } private void ExportButton_Click(object sender, RoutedEventArgs e) { var table = CreateSampleData(TypeOfSurrounding.LevelThree); var table1 = CreateSampleData(TypeOfSurrounding.LevelFive); var saveDialog = new SaveFileDialog { Filter = "Excel文件|*.xlsx", FileName = $"工程量表.xlsx", InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) }; if (saveDialog.ShowDialog() == true) { ExportToExcel(new List() { table, table1 }, saveDialog.FileName, 2, 0); MessageBox.Show("导出成功!", "完成", MessageBoxButton.OK, MessageBoxImage.Information); } } private void ExportToExcel(List tables, string filePath, int startRowIndex, int startColumnIndex) { var workbook = new XSSFWorkbook(); // 创建样式 var style = CreateCellStyle(workbook); //var borderStyle = CreateBorderStyle(workbook); foreach (SheetTable table in tables) { int startRowIndexTemp = startRowIndex; int startColumnIndexTemp = startColumnIndex; var sheet = workbook.CreateSheet(table.Name); var measurement = table.MainCategories.FirstOrDefault().SubCategories.FirstOrDefault().DetailCategories.FirstOrDefault().MeasureTypes.FirstOrDefault(); CreateSheetTitle(sheet, measurement); foreach (var mainCat in table.MainCategories) { int mainStartRow = startRowIndexTemp; foreach (var subCat in mainCat.SubCategories) { int subStartRow = startRowIndexTemp; foreach (var detailCate in subCat.DetailCategories) { int detailStartRow = startRowIndexTemp; foreach (var measureType in detailCate.MeasureTypes) { int measureStartRow = startRowIndexTemp; IRow row = sheet.CreateRow(startRowIndexTemp); // 只在第一次出现时创建主分类单元格 if (startRowIndexTemp == mainStartRow) { CreateCell(row, startColumnIndexTemp, mainCat.Name); } // 只在第一次出现时创建子分类单元格 if (startRowIndexTemp == subStartRow) { CreateCell(row, startColumnIndexTemp + 1, subCat.Name); } // 只在第一次出现时创建细项分类单元格 if (startRowIndexTemp == detailStartRow) { CreateCell(row, startColumnIndexTemp + 2, detailCate.Name); } // 只在第一次出现时创建计量方式单元格 if (startRowIndexTemp == measureStartRow) { CreateCell(row, startColumnIndexTemp + 3, measureType.Unit.GetDescription()); } for (int i = 0; i < measureType.Proofs.Count; i++) { var proof = measureType.Proofs.ElementAt(i); CreateCell(row, startColumnIndexTemp + 4 + i, proof.Amount); } //合计 CreateCell(row, startColumnIndexTemp + 4 + measureType.Proofs.Count, measureType.Total); CreateCell(row, startColumnIndexTemp + 5 + measureType.Proofs.Count, measureType.CalculationRule); CreateCell(row, startColumnIndexTemp + 6 + measureType.Proofs.Count, measureType.Description); startRowIndexTemp++; } //合并细项单元格 if (startRowIndexTemp > detailStartRow + 1) { sheet.AddMergedRegion(new CellRangeAddress( detailStartRow, startRowIndexTemp - 1, startColumnIndexTemp + 2, startColumnIndexTemp + 2)); //sheet.GetRow(detailStartRow).GetCell(startColumnIndexTemp + 2).CellStyle = style; } } // 合并子分类单元格 if (startRowIndexTemp > subStartRow + 1) { sheet.AddMergedRegion(new CellRangeAddress( subStartRow, startRowIndexTemp - 1, startColumnIndexTemp + 1, startColumnIndexTemp + 1)); //sheet.GetRow(subStartRow).GetCell(startColumnIndexTemp + 1).CellStyle = subStyle; } } // 合并主分类单元格 if (startRowIndexTemp > mainStartRow + 1) { sheet.AddMergedRegion(new CellRangeAddress(mainStartRow, startRowIndexTemp - 1, startColumnIndexTemp, startColumnIndexTemp)); //sheet.GetRow(mainStartRow).GetCell(startColumnIndexTemp).CellStyle = mainStyle; } } // 从第二行开始调整样式 for (int i = 2; i < sheet.LastRowNum + 1; i++) { IRow row = sheet.GetRow(i); for (int j = 0; j < measurement.Proofs.Count + 7; j++) { ICell cell = row.GetCell(j) ?? row.CreateCell(j); cell.CellStyle = style; sheet.AutoSizeColumn(j); } } // 遍历所有合并区域并设置样式 //for (int i = 0; i < sheet.NumMergedRegions; i++) //{ // CellRangeAddress region = sheet.GetMergedRegion(i); // IRow row = sheet.GetRow(region.FirstRow); // ICell cell = row.GetCell(region.FirstColumn); // cell.CellStyle = style; //} } using (var fs = new FileStream(filePath, FileMode.Create)) { workbook.Write(fs); } } private void Button_Click(object sender, RoutedEventArgs e) { var dialog = new OpenFileDialog() { }; var result = dialog.ShowDialog(); if (result == true) { //using (OleDbConnection oleDbConnection = new OleDbConnection()) //{ // oleDbConnection.ConnectionString = $"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={dialog.FileName}"; // OleDbCommand oleDbCommand = new OleDbCommand(); // oleDbCommand.CommandText = "select * from [zksd]"; // oleDbCommand.Connection = oleDbConnection; // using (OleDbDataAdapter da = new OleDbDataAdapter(oleDbCommand)) // { // DataTable dt = new DataTable(); // da.Fill(dt); // dg.DataContext = dt; // } //} MdbHelper mdbHelper = new MdbHelper(dialog.FileName); mdbHelper.Open(); var tables = mdbHelper.GetTables(); foreach (DataRow row in tables.Rows) { var tableName = row["TABLE_NAME"].ToString(); var ds = mdbHelper.GetDataSetByTableName(tableName); var dt = ds.Tables[0]; foreach (DataRow r in dt.Rows) { foreach (DataColumn c in dt.Columns) { Console.WriteLine(r[c]); } } } } } } }