using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using OTSIncAReportApp._1_UI.OTSReportExport.DataIntegration;
using OTSIncAReportApp.DataOperation.DataAccess;
using OTSIncAReportApp.OTSRstMgrFunction;
using OTSIncAReportApp.OTSSampleReportInfo;
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
namespace OTSIncAReportApp.Control_ECharts
{
///
/// 三元相图EChart版
///
public partial class DEVChart_Trianglediagram : UserControl
{
#region 变量定义
public List m_list_string_sizelevel; //图例中:颗粒粒级字符列表
public List m_old_list_string_sizelevel;//图例中,颗粒粒级字符列表,未处理格式的,从底层拿出来的原始格式
public List m_list_string_samplename;//图例中:样品名字符列表
private List TernaryData = new List();//当前三元图的数据
private List TernaryName = new List();//三元图名称
public string Template { get; set; }
public int condition = -1;
frmReportApp m_ReportApp;
frmReportConditionChoose m_condition;
ResultDataMgr m_DataMgr;
private bool ReportExporting = false;
public bool Report { set; get; }
///
/// 判断颗粒范围(true全部颗粒,false选择颗粒)
///
public bool ParticleRange { set; get; }
#endregion
#region 构造函数及窗体加载
///
/// 三角图,构造函数
///
/// 传入,委托类对象
/// 传入,项目管理类对象
public DEVChart_Trianglediagram(frmReportApp ReportApp)
{
m_list_string_sizelevel = new List();
m_list_string_samplename = new List();
m_old_list_string_sizelevel = new List();
TernaryData = new List();
m_ReportApp = ReportApp;
m_condition = ReportApp.m_conditionChoose;
m_DataMgr = ReportApp.m_rstDataMgr;
InitializeComponent();
}
private void EChart_Trianglediagram_Load(object sender, EventArgs e)
{
List listDraw = new List();
string template = Template;
TernaryName.Clear();
if (template == "")
{ //三元相图模板
template = m_condition.m_conditionData.GetPropItemDisplayValueByPropItemName(OTS_REPORT_PROP_GRID_ITEMS.TRIO_CHART_TYPE).ToString();
}
//获取粒级表
string pathtpf = Application.StartupPath + "\\Config\\ProData\\DefaultTriTemplateFile.tpf";
List nameList = new List();
DataSet ds = XMLoperate.GetXmlData(pathtpf, "XMLData");
DataTable dt = ds.Tables["Member"];
string TemplateName ="";
//设置标签名称
List listName = new List();
//获取粒级表
string pathe = m_DataMgr.m_RptConfigFile.PartSizeFileFolder + m_DataMgr.m_RptConfigFile.PartSizeFile;
DataSet ds2 = XMLoperate.GetXml(pathe);
string sizestr = ds2.Tables[0].Rows[0]["Sizes"].ToString();
for (int i = 0; i < sizestr.Split(',').Length - 1; i++)
{
if (sizestr.Split(',')[i].Length > 0)
{
double d1 = Convert.ToDouble(sizestr.Split(',')[i]);
double d2 = Convert.ToDouble(sizestr.Split(',')[i + 1]);
listName.Add(d1.ToString() + "~" + d2.ToString());
}
}
double d = Convert.ToDouble(sizestr.Split(',')[sizestr.Split(',').Length - 1]);
listName.Add(d.ToString() + "~MAX");
Bitmap map = new Bitmap(950, 115);
Graphics g = Graphics.FromImage(map);
SolidBrush sbrush_White = new SolidBrush(Color.White);
SolidBrush sbrush = new SolidBrush(Color.Black);
g.FillRectangle(sbrush_White, 0, 0, 950, 115);
Font myFont = new Font("Arial", 10, FontStyle.Regular);
Font myFont2 = new Font("Arial", 10, FontStyle.Regular);
Pen mypen = new Pen(Color.Black, 1);
List Color_list = SetColor_list();
string str_unit = "";
int PositionJeight = 27;
TernaryDiagram ternaryDiagram = new TernaryDiagram();
for (int i = 0; i < listName.Count; i = i + 8)
{
if (i < listName.Count)
{
//SolidBrush sbrush_Color = new SolidBrush(Color_list[i]);
ternaryDiagram.ShapeList(0, new PointF(10, PositionJeight), 10, Color_list[i], g);
//g.DrawRectangle(mypen, 0, PositionJeight, 8, 8);
//g.FillRectangle(sbrush_Color, 1, PositionJeight + 1, 7, 7);
g.DrawString(listName[i].ToString() + str_unit, myFont2, sbrush, 22, PositionJeight - 2);
}
if (i + 1 < listName.Count)
{
//SolidBrush sbrush_Color = new SolidBrush(Color_list[i + 1]);
ternaryDiagram.ShapeList(1, new PointF(104, PositionJeight), 10, Color_list[i+1], g);
//g.DrawRectangle(mypen, 94, PositionJeight, 8, 8);
//g.FillRectangle(sbrush_Color, 95, PositionJeight + 1, 7, 7);
g.DrawString(listName[i + 1].ToString() + str_unit, myFont2, sbrush, 116, PositionJeight - 2);
}
if (i + 2 < listName.Count)
{
//SolidBrush sbrush_Color = new SolidBrush(Color_list[i + 2]);
ternaryDiagram.ShapeList(2, new PointF(194, PositionJeight), 10, Color_list[i + 2], g);
//g.DrawRectangle(mypen, 188, PositionJeight, 8, 8);
//g.FillRectangle(sbrush_Color, 189, PositionJeight + 1, 7, 7);
g.DrawString(listName[i + 2].ToString() + str_unit, myFont2, sbrush, 206, PositionJeight - 2);
}
if (i + 3 < listName.Count)
{
//SolidBrush sbrush_Color = new SolidBrush(Color_list[i + 3]);
ternaryDiagram.ShapeList(3, new PointF(292, PositionJeight), 10, Color_list[i + 3], g);
//g.DrawRectangle(mypen, 282, PositionJeight, 8, 8);
//g.FillRectangle(sbrush_Color, 283, PositionJeight + 1, 7, 7);
g.DrawString(listName[i + 3].ToString() + str_unit, myFont2, sbrush, 304, PositionJeight - 2);
}
if (i + 4 < listName.Count)
{
//SolidBrush sbrush_Color = new SolidBrush(Color_list[i + 4]);
ternaryDiagram.ShapeList(0, new PointF(386, PositionJeight), 10, Color_list[i + 4], g);
//g.DrawRectangle(mypen, 376, PositionJeight, 8, 8);
//g.FillRectangle(sbrush_Color, 377, PositionJeight + 1, 7, 7);
g.DrawString(listName[i + 4].ToString() + str_unit, myFont2, sbrush, 398, PositionJeight - 2);
}
if (i + 5 < listName.Count)
{
//SolidBrush sbrush_Color = new SolidBrush(Color_list[i + 5]);
ternaryDiagram.ShapeList(1, new PointF(480, PositionJeight), 10, Color_list[i + 5], g);
//g.DrawRectangle(mypen, 470, PositionJeight, 8, 8);
//g.FillRectangle(sbrush_Color, 471, PositionJeight + 1, 7, 7);
g.DrawString(listName[i + 5].ToString() + str_unit, myFont2, sbrush, 492, PositionJeight - 2);
}
if (i + 6 < listName.Count)
{
//SolidBrush sbrush_Color = new SolidBrush(Color_list[i + 6]);
ternaryDiagram.ShapeList(2, new PointF(574, PositionJeight), 10, Color_list[i + 6], g);
//g.DrawRectangle(mypen, 564, PositionJeight, 8, 8);
//g.FillRectangle(sbrush_Color, 565, PositionJeight + 1, 7, 7);
g.DrawString(listName[i + 6].ToString() + str_unit, myFont2, sbrush, 586, PositionJeight - 2);
}
if (i + 7 < listName.Count)
{
//SolidBrush sbrush_Color = new SolidBrush(Color_list[i + 7]);
ternaryDiagram.ShapeList(3, new PointF(668, PositionJeight), 10, Color_list[i + 7], g);
//g.DrawRectangle(mypen, 658, PositionJeight, 8, 8);
//g.FillRectangle(sbrush_Color, 659, PositionJeight + 1, 7, 7);
g.DrawString(listName[i + 7].ToString() + str_unit, myFont2, sbrush, 680, PositionJeight - 2);
}
//if (i + 8 < listName.Count)
//{
// SolidBrush sbrush_Color = new SolidBrush(Color_list[i + 5]);
// g.DrawRectangle(mypen, 752, PositionJeight, 8, 8);
// g.FillRectangle(sbrush_Color, 753, PositionJeight + 1, 7, 7);
// g.DrawString(listName[i + 8].ToString() + str_unit, myFont2, sbrush, 762, PositionJeight - 2);
//}
//if (i + 9 < listName.Count)
//{
// SolidBrush sbrush_Color = new SolidBrush(Color_list[i + 5]);
// g.DrawRectangle(mypen, 846, PositionJeight, 8, 8);
// g.FillRectangle(sbrush_Color, 847, PositionJeight + 1, 7, 7);
// g.DrawString(listName[i + 9].ToString() + str_unit, myFont2, sbrush, 856, PositionJeight - 2);
//}
PositionJeight = PositionJeight + 15;
}
PictureBox pictureBox = new PictureBox();
pictureBox.Size = new Size(950, 115);
pictureBox.Location = new Point(40, 10);
pictureBox.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBox.Image = map;
this.panel1.Controls.Add(pictureBox);
//遍历第一层节点
foreach (DataRow element in dt.Rows)
{
string Name = element["TemplateName"].ToString();
if (Name == template)
{
string Element = element["Element"].ToString();
nameList.Add(Element.Split('.')[0]);
nameList.Add(Element.Split('.')[1]);
nameList.Add(Element.Split('.')[2]);
TernaryName.Add(template.Split('.')[0]);
TernaryName.Add(template.Split('.')[1]);
TernaryName.Add(template.Split('.')[2]);
TemplateName=Name;
break;
}
}
//将所有的测量结果名添加到list中
m_list_string_samplename.Clear();
TernaryData.Clear();
string sou = "";
int sel = 0;
if (Report)
{
sou = m_DataMgr.ResultFilesList[m_DataMgr.GetWorkingResultId()].anotherFileName.ToString();
if(ParticleRange)
{
sel = 0;
}
else
{
sel = 1;
}
}
else
{
sou = m_condition.m_CurrentConditions[OTS_REPORT_PROP_GRID_ITEMS.DATA_SOURCE].itemDisplayVal.ToString();
//判断颗粒范围(全部颗粒或者选择颗粒)
sel = m_ReportApp.m_conditionChoose.m_conditionData.GetComboDownListIndexByItemName(OTS_REPORT_PROP_GRID_ITEMS.DATA_SOURCE_TYPE);
}
Report = false;
if (sou.Contains("+"))
{
if (m_ReportApp.more)
{
m_ReportApp.trans = false;
}
else
{
m_ReportApp.trans = true;
}
for (int i = 0; i < sou.Split('+').Length; i++)
{
ResultFile resultFile = m_DataMgr.ResultFilesList.Find(s => s.anotherFileName == sou.Split('+')[i]);
if (resultFile == null)
{
continue;
}
DataTable cl = GettriangleJsonClass(resultFile.FilePath, resultFile.anotherFileName, nameList,sel);
listDraw.Add(cl);
}
}
else
{
if (!m_ReportApp.more)
{
m_ReportApp.trans = false;
}
else
{
m_ReportApp.trans = true;
}
m_ReportApp.more = false;
ResultFile resultFile;
int index = (int)m_condition.m_CurrentConditions[OTS_REPORT_PROP_GRID_ITEMS.DATA_SOURCE].itemVal;
if (ReportExporting)
{
resultFile = m_DataMgr.ResultFilesList[m_DataMgr.GetWorkingResultId()];
}
else
{
resultFile = m_DataMgr.ResultFilesList[index];
}
ReportExporting = false;
DataTable cl = GettriangleJsonClass(resultFile.FilePath, resultFile.anotherFileName, nameList, sel);
listDraw.Add(cl);
}
int point = 40;
for (int i=0;i
/// 颜色列表
///
///
private List SetColor_list()
{
List Color_list = new List();
Color_list.Add(FromHex("#0f4471"));
Color_list.Add(FromHex("#FFD700"));
Color_list.Add(FromHex("#ff5722"));
Color_list.Add(FromHex("#5628b4"));
Color_list.Add(FromHex("#20BF55"));
Color_list.Add(FromHex("#f23557"));
Color_list.Add(FromHex("#118df0"));
Color_list.Add(FromHex("#FF00FF"));
Color_list.Add(FromHex("#d3327b"));
Color_list.Add(FromHex("#ae318a"));
Color_list.Add(FromHex("#993090"));
Color_list.Add(FromHex("#6f3071"));
Color_list.Add(FromHex("#7711AF"));
Color_list.Add(FromHex("#CF77FF"));
Color_list.Add(FromHex("#AE004F"));
Color_list.Add(FromHex("#F35872"));
Color_list.Add(FromHex("#FA7729"));
Color_list.Add(FromHex("#FFC526"));
Color_list.Add(FromHex("#F8E71C"));
Color_list.Add(FromHex("#34ADAE"));
Color_list.Add(FromHex("#3DDFD2"));
Color_list.Add(FromHex("#A0FFFF"));
return Color_list;
}
///
/// 绘制图形
///
/// 数据
/// 表名称
/// 颜色列
///
private Bitmap Plot(DataTable dt_point_sort, string TemplateName, List Color_list)
{
int Line = 500;
Bitmap map = new Bitmap(530, 530);
Graphics g = Graphics.FromImage(map);
SolidBrush sbrush_White = new SolidBrush(Color.White);
g.FillRectangle(sbrush_White, 0, 0, 530, 530);
Pen mypen = new Pen(Color.Black, 1);
g.DrawImage(map, 0, 0, map.Width, map.Height);
g.DrawLine(mypen, new Point(Line + 10, Line), new Point(Line / 2 + 10, Convert.ToInt32(Line - (Line / 2 * 1.732))));//"\"
g.DrawLine(mypen, new Point(Line / 2 + 10, Convert.ToInt32(Line - (Line / 2 * 1.732))), new Point(0 + 10, Line));//"/"
g.DrawLine(mypen, new Point(0 + 10, Line), new Point(Line + 10, Line));//"_"
mypen.DashStyle = System.Drawing.Drawing2D.DashStyle.Custom;
mypen.DashPattern = new float[] { 2, 2 };
mypen = new Pen(Color.FromArgb(212, 212, 212), 1);
int point = Line / 10;
for (int i = 1; i < 10; i++)
{
//"\"
int x1_a = point / 2 + ((point / 2) * (i - 1));
int x2_a = Line - (43 * i);
int y1_a = point * i;
g.DrawLine(mypen, new Point(x1_a + 10, x2_a), new Point(y1_a + 10, Line));
//"/"
int x1_b = Line - (point / 2 + ((point / 2) * (i - 1)));
int x2_b = Line - (43 * i);
int y1_b = Line - (point * i);
g.DrawLine(mypen, new Point(x1_b + 10, x2_b), new Point(y1_b + 10, Line));
//"_"
int x1_c = point / 2 + ((point / 2) * (i - 1));
int x2_c = Line - (43 * i);
int y1_c = Line - (point / 2 + ((point / 2) * (i - 1)));
int y2_c = Line - (43 * i);
g.DrawLine(mypen, new Point(x1_c + 10, x2_c), new Point(y1_c + 10, y2_c));
g.DrawLine(mypen, new Point(y1_a + 10, Line + 10), new Point(y1_a + 10, Line));
g.DrawLine(mypen, new Point(x1_b + 10, x2_b), new Point(x1_b + 10 + 10, x2_b));
g.DrawLine(mypen, new Point(x1_c + 10 - 10, x2_c), new Point(y1_c + 10, y2_c));
g.DrawString((i * 10).ToString(), new Font("Arial Unicode MS", 8, FontStyle.Bold), new SolidBrush(Color.Black), new Point(x1_c - 20, x2_c - 5));
g.DrawString((i * 10).ToString(), new Font("Arial Unicode MS", 8, FontStyle.Bold), new SolidBrush(Color.Black), new Point(y1_b, Line + 8));
g.DrawString(((10 - i) * 10).ToString(), new Font("Arial Unicode MS", 8, FontStyle.Bold), new SolidBrush(Color.Black), new Point(x1_b + 20, x2_b - 5));
}
mypen = new Pen(Color.Black, 1);
TernaryDiagram ternaryDiagram = new TernaryDiagram();
int order = 1;
HashSet hashSet = new HashSet();
for (int i = 0; i < dt_point_sort.Rows.Count; i++)
{
int pos = Convert.ToInt32(dt_point_sort.Rows[i]["Color_position"]);
if (pos > 3)
{
order = pos % 4;
}
else
{
order = pos;
}
PointF pointF = new PointF(Convert.ToInt32(dt_point_sort.Rows[i]["X"])+10, 500 - Convert.ToInt32(dt_point_sort.Rows[i]["Y"]));
ternaryDiagram.ShapeList(order, pointF, 10, Color_list[Convert.ToInt32(dt_point_sort.Rows[i]["Color_position"])], g);
//SolidBrush mysbrush = new SolidBrush(Color_list[Convert.ToInt32(dt_point_sort.Rows[i]["Color_position"])]);
//g.FillRectangle(mysbrush, Convert.ToInt32(dt_point_sort.Rows[i]["X"]) + 8, 500 - Convert.ToInt32(dt_point_sort.Rows[i]["Y"]) - 2, 4, 5);
//g.DrawRectangle(mypen, Convert.ToInt32(dt_point_sort.Rows[i]["X"]) + 7, 500 - Convert.ToInt32(dt_point_sort.Rows[i]["Y"]) - 2, 5, 5);
}
Font myFont = new Font("Arial Unicode MS", 13, FontStyle.Bold);
Font Font_features = new Font("Arial Unicode MS", 10, FontStyle.Bold);
SolidBrush sbrush = new SolidBrush(Color.Black);
g.DrawString("features:" + dt_point_sort.Rows.Count.ToString(), Font_features, sbrush, 400, 200);
g.DrawString(TemplateName, myFont, sbrush, 265 - (TemplateName.Length * 10 / 2), 10);
g.DrawString(TemplateName.Split('.')[0].ToString(), myFont, sbrush, 265 - (TemplateName.Split('.')[0].ToString().Length * 10 / 2), 45);//顶点名字
g.DrawString(TemplateName.Split('.')[1].ToString(), myFont, sbrush, 0, 510);//左侧名字
g.DrawString(TemplateName.Split('.')[2].ToString(), myFont, sbrush, 500 - (TemplateName.Split('.')[0].ToString().Length * 10), 510);//左侧名字
#endregion
return map;
}
public static Color FromHex(string hex)
{
hex = hex.Replace("#", ""); // 移除 # 前缀
byte a = 255; // 默认Alpha值为255(不透明)
byte r = Convert.ToByte(hex.Substring(0, 2), 16);
byte g = Convert.ToByte(hex.Substring(2, 2), 16);
byte b = Convert.ToByte(hex.Substring(4, 2), 16);
return Color.FromArgb(a, r, g, b);
}
private DataTable GettriangleJsonClass(string path, string name, List nameList, int sel)
{
DataTable data = new DataTable();
data.Columns.Add("A");
data.Columns.Add("B");
data.Columns.Add("C");
data.Columns.Add("DMAX");
data.Columns.Add("DMIN");
DataTable runData = new DataTable();
runData.Columns.Add("X");
runData.Columns.Add("Y");
runData.Columns.Add("C");
runData.Columns.Add("Color_position");
List list_string_sort = new List();
List list_point_sort = new List();
DataTable particles = GetParticles(path, nameList, sel);
foreach (DataRow item in particles.Rows)
{
if (item["particleLocation"].ToString() == "0,0,0")
{
continue;
}
list_string_sort.Add(item["sizeLevel"].ToString());
double top = Convert.ToDouble(item["top"]);
double left = Convert.ToDouble(item["left"]);
double right = Convert.ToDouble(item["right"]);
//x=right+top/2,y=(√3/2)*top
double Y = 0.866 * top * 500;
double X = (right + top / 2) * 500;
double[] point = { Math.Round(X, 2), Math.Round(Y) };
list_point_sort.Add(point);
DataRow dr = data.NewRow();
dr["A"] = top.ToString();
dr["B"] = left.ToString();
dr["C"] = right.ToString();
dr["DMAX"] = item["DMAX"].ToString();
dr["DMIN"] = item["DMIN"].ToString();
data.Rows.Add(dr);
DataRow runDR = runData.NewRow();
runDR["X"] = Math.Round(X);
runDR["Y"] = Math.Round(Y);
runDR["Color_position"] = item["Color_position"].ToString();
runData.Rows.Add(runDR);
}
TernaryData.Add(data);
return runData;
}
///
/// 导出Excel数据
///
private void ExportExcelDocument()
{
// 创建一个SaveFileDialog实例
SaveFileDialog saveFileDialog = new SaveFileDialog();
// 设置对话框的标题
saveFileDialog.Title = "选择Excel文件保存位置";
// 设置默认的文件扩展名为.xlsx
saveFileDialog.DefaultExt = "xlsx";
// 设置过滤器,限制用户可以选择的文件类型为Excel文件
saveFileDialog.Filter = "Excel文件 (*.xlsx)|*.xlsx";
// 显示对话框并检查用户是否点击了“保存”按钮
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
// 获取用户选择的文件路径
string filePath = saveFileDialog.FileName;
// 调用导出方法
ExportDataTableToExcel(TernaryData, filePath);
}
}
//获取颗粒信息
private DataTable GetParticles(string filepath, List nameList,int sel)
{
ParticleData particledata = new ParticleData(filepath);
//设置标签名称
List listName = new List();
//获取粒级表
string pathe = m_DataMgr.m_RptConfigFile.PartSizeFileFolder + m_DataMgr.m_RptConfigFile.PartSizeFile;
DataSet ds = XMLoperate.GetXml(pathe);
string sizestr = ds.Tables[0].Rows[0]["Sizes"].ToString();
for (int i = 0; i < sizestr.Split(',').Length - 1; i++)
{
if (sizestr.Split(',')[i].Length > 0)
{
double d1 = Convert.ToDouble(sizestr.Split(',')[i]);
double d2 = Convert.ToDouble(sizestr.Split(',')[i + 1]);
listName.Add(d1.ToString() + "~" + d2.ToString());
}
}
double d = Convert.ToDouble(sizestr.Split(',')[sizestr.Split(',').Length - 1]);
listName.Add(d.ToString() + "~MAX");
string filedAndParticl = "";
string po = "";
string con = "";
int row = m_condition.m_conditionData.ConditionItemList.Count;
if (condition != -1)
{
List li = new List() { "DMAX", "DMIN", "Area", "FERET" };
con = li[condition];
}
else
{
if (row < 4)
{
con = "DMAX";
}
else
{
con = m_condition.m_conditionData.GetPropItemDisplayValueByPropItemName( OTS_REPORT_PROP_GRID_ITEMS.SIZE_CAL_METHOD_TYPE).ToString();
}
}
switch (con)
{
case "DMAX":
po = "DMAX";
break;
case "DMIN":
po = "DMIN";
break;
case "ECD":
po = "Area";
break;
case "FERET":
po = "DFERET";
break;
}
//particledata.GetParticleAllHaveXray("");
//DataTable dtp = particledata.GetParticleHaveXray(filedAndParticl);//旧
DataTable dtp = particledata.GetParticleAllHaveXray(filedAndParticl);//新
//创建一个临时表
DataTable ret_dt = new DataTable();
//然后额外存放三列,用于存放拆分后三个顶点的值
ret_dt.Columns.Add("sizeLevel");
ret_dt.Columns.Add("particleLocation");
ret_dt.Columns.Add("top");
ret_dt.Columns.Add("left");
ret_dt.Columns.Add("right");
ret_dt.Columns.Add("Color_position");
ret_dt.Columns.Add("DMAX");
ret_dt.Columns.Add("DMIN");
for (int k = 0; k < listName.Count; k++)
{
string str = listName[k];
string d1 = str.Split('~')[0];
string d2 = str.Split('~')[1];
if (d2 == "MAX")
{
d2 = "999";
}
DataRow[] datas = dtp.Select(getWhere(d2, d1, po));
foreach (var item in datas)
{
DataRow dr = ret_dt.NewRow();
dr["sizeLevel"] = str;
string element = item["Element"].ToString();
string strRet = getStrRet(nameList, element);
dr["particleLocation"] = strRet;
dr["top"] = strRet.Split(',')[0];
dr["left"] = strRet.Split(',')[1];
dr["right"] = strRet.Split(',')[2];
dr["Color_position"] = k.ToString();
string strDMAX = item["DMAX"].ToString();
string strDMIN = item["DMIN"].ToString();
dr["DMAX"] = strDMAX;
dr["DMIN"] = strDMIN;
ret_dt.Rows.Add(dr);
}
}
return ret_dt;
}
private string getWhere(string max, string min, string col)
{
return col + ">=" + min + " and " + col + "<=" + max;
}
private string getStrRet(List template, string element)
{
List name = new List()
{ "h","he",
"li","be","b","c","n","o","f","ne",
"na","mg","al","si","p","s","cl","ar",
"k","ca","sc","ti","v","cr","mn","fe","co","ni","cu","zn","ga","ge","as","se","br","kr",
"rb","sr","y","zr","nb","mo","tc","ru","rh","pd","ag","cd","in","sn","sb","te","i","xe",
"cs","ba","la",
"ce","pr","nd","pm","sm","eu","gd","tb","dy","ho","er","tm","yb","lu",
"hf","ta","w","re","os","ir","pt","au","hg","tl","pb","bi","po","at","rn",
"fr","ra","ac",
"th","pa","u","np","pu","am","cm","bk","cf","es","fm","md","no","lr"
};
List value = new List()
{ 1.008,4.003,
6.941,9.012,10.811,12.011,14.007,15.999,18.998,20.180,
22.990,24.305,26.982,28.086,30.974,32.066,35.453,39.948,
39.098,40.08,44.956,47.88,50.942,51.996,54.938,55.847,58.933,58.70,63.546,65.39,69.72,72.61,74.922,78.96,79.904,83.80,
85.468,87.62,88.906,91.22,92.906,95.94,98.00,101.07,102.906,106.42,107.868,112.41,114.82,118.71,121.76,127.60,126.905,131.29,
132.905,137.33,138.906,
140.12,140.908,144.24,145.0,150.36,151.97,157.25,158.925,162.50,64.93,167.26,168.934,173.04,174.967,
178.49,180.948,183.85,186.207,190.20,192.22,195.08,196.967,200.59,204.38,207.2,208.980,209.00,210.00,222.00,
223.00,226.025,227.028,
232.038,231.036,238.029,237.048,244.00,243.00,247.00,247.00,251.00,252.00,257.00,258.00,259.00,260.00
};
double d_ASum = 0;
double d_BSum = 0;
double d_CSum = 0;
string aElements = template[0];
string bElements = template[1];
string cElements = template[2];
foreach (var item in element.Split(';'))
{
if (item.Contains(aElements + "-"))
{
if (aElements != "")
{
d_ASum = Convert.ToDouble(item.Split('-')[1]) / value[name.IndexOf(aElements.ToLower())];
}
}
for (int i = 0; i < bElements.Split(',').Length; i++)
{
string e = bElements.Split(',')[i];
if (item.Contains(e + "-"))
{
d_BSum = d_BSum + Convert.ToDouble(item.Split('-')[1]) / value[name.IndexOf(e.ToLower())];
}
}
if (item.Contains(cElements + "-"))
{
if (cElements != "")
d_CSum = Convert.ToDouble(item.Split('-')[1]) / value[name.IndexOf(cElements.ToLower())];
}
}
double allNums = d_ASum + d_BSum + d_CSum;
string strRet = "";
if ((allNums) == 0)
{
strRet = "0,0,0";
}
else
{
double aPercent = 0, bPercent = 0, cPercent = 0;
if (d_ASum != 0)
{
aPercent = d_ASum / allNums;
}
if (d_BSum != 0)
{
bPercent = d_BSum / allNums;
}
if (d_CSum != 0)
{
cPercent = d_CSum / allNums;
}
strRet = aPercent.ToString() + "," + bPercent.ToString() + "," + cPercent.ToString();
}
return strRet;
}
private void ExportDataTableToExcel(List dataTable, string filePath)
{
// 创建一个新的工作簿
IWorkbook workbook = new XSSFWorkbook(); // 对于.xlsx格式
// IWorkbook workbook = new HSSFWorkbook(); // 对于.xls格式
for (int a=0;a< dataTable.Count;a++)
{
// 添加一个新的工作表
ISheet sheet = workbook.CreateSheet("Sheet"+(a+1).ToString());
// 创建表头行(第一行)
IRow headerRow = sheet.CreateRow(0);
ICell cell1 = headerRow.CreateCell(0);
cell1.SetCellValue(TernaryName[0].ToString());
ICell cell2 = headerRow.CreateCell(1);
cell2.SetCellValue(TernaryName[1].ToString());
ICell cell3 = headerRow.CreateCell(2);
cell3.SetCellValue(TernaryName[2].ToString());
ICell cell4 = headerRow.CreateCell(3);
cell4.SetCellValue("DMAX");
ICell cell5 = headerRow.CreateCell(4);
cell5.SetCellValue("DMIN");
// 填充数据行
for (int i = 0; i < dataTable[a].Rows.Count; i++)
{
IRow row = sheet.CreateRow(i + 1);
for (int j = 0; j < dataTable[a].Columns.Count; j++)
{
ICell cell = row.CreateCell(j);
if (dataTable[a].Rows[i][j] != DBNull.Value)
{
cell.SetCellValue(dataTable[a].Rows[i][j].ToString());
}
}
}
// 自动调整列宽(可选)
// 注意:NPOI的AutoSizeColumn方法不如EPPlus的AutoFitColumns方法那样精确
// 你可能需要手动设置列宽或者接受默认的宽度
// 但以下是一个尝试自动调整列宽的示例,它可能不完全符合你的期望
for (int i = 0; i < dataTable[a].Columns.Count; i++)
{
sheet.AutoSizeColumn(i);
// 或者,你可以设置一个固定的宽度(以字符为单位)
// sheet.SetColumnWidth(i, 20 * 256); // 20是字符宽度,256是转换因子
}
}
// 保存Excel文件
using (FileStream fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
{
workbook.Write(fileStream);
}
// 释放资源(对于.xlsx格式,通常不需要显式调用Dispose,因为XSSFWorkbook实现了IDisposable但内部已经处理了资源释放)
// 但为了良好的编程习惯,你可以显式调用(尽管这里不是必需的)
// workbook.Dispose(); // 如果你使用的是实现了IDisposable的对象,并且想确保资源被释放
}
private void button1_Click_1(object sender, EventArgs e)
{
ExportExcelDocument();
}
}
}