375 lines
16 KiB
C#
375 lines
16 KiB
C#
|
|
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
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// MainWindow.xaml 的交互逻辑
|
|||
|
|
/// </summary>
|
|||
|
|
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<SheetTable>() { table, table1 }, saveDialog.FileName, 2, 0);
|
|||
|
|
MessageBox.Show("导出成功!", "完成", MessageBoxButton.OK, MessageBoxImage.Information);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void ExportToExcel(List<SheetTable> 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]);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|