EChart_Trianglediagram.cs 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805
  1. using CefSharp;
  2. using CefSharp.WinForms;
  3. using Newtonsoft.Json;
  4. using NPOI.SS.UserModel;
  5. using NPOI.XSSF.UserModel;
  6. using OTSIncAReportApp.DataOperation.DataAccess;
  7. using OTSIncAReportApp.OTSRstMgrFunction;
  8. using OTSIncAReportApp.OTSSampleReportInfo;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Data;
  12. using System.Drawing;
  13. using System.IO;
  14. using System.Runtime.Serialization;
  15. using System.Windows.Forms;
  16. namespace OTSIncAReportApp.Control_ECharts
  17. {
  18. /// <summary>
  19. /// 三元相图EChart版
  20. /// </summary>
  21. public partial class EChart_Trianglediagram : UserControl
  22. {
  23. #region 变量定义
  24. public List<string> m_list_string_sizelevel; //图例中:颗粒粒级字符列表
  25. public List<string> m_old_list_string_sizelevel;//图例中,颗粒粒级字符列表,未处理格式的,从底层拿出来的原始格式
  26. public List<string> m_list_string_samplename;//图例中:样品名字符列表
  27. private DataTable TernaryData = new DataTable();//当前三元图的数据
  28. private List<string> TernaryName = new List<string>();//三元图名称
  29. public string Template { get; set; }
  30. public int condition = -1;
  31. /// <summary>
  32. /// 全局函数,与json数据对应的类结构
  33. /// </summary>
  34. List<TriangleJsonClass> m_list_trianglejsonclass = null;
  35. string url = "CefSharp\\Resources/HTML/charts.html";
  36. frmReportApp m_ReportApp;
  37. frmReportConditionChoose m_condition;
  38. ResultDataMgr m_DataMgr;
  39. private bool ReportExporting = false;
  40. public bool Report { set; get; }
  41. /// <summary>
  42. /// 判断颗粒范围(true全部颗粒,false选择颗粒)
  43. /// </summary>
  44. public bool ParticleRange { set; get; }
  45. #endregion
  46. #region 构造函数及窗体加载
  47. /// <summary>
  48. /// 三角图,构造函数
  49. /// </summary>
  50. /// <param name="in_sec">传入,委托类对象</param>
  51. /// <param name="in_Cotsreportprojfilemgrclr">传入,项目管理类对象</param>
  52. public EChart_Trianglediagram(frmReportApp ReportApp)
  53. {
  54. m_list_trianglejsonclass = new List<TriangleJsonClass>();
  55. m_list_string_sizelevel = new List<string>();
  56. m_list_string_samplename = new List<string>();
  57. m_old_list_string_sizelevel = new List<string>();
  58. m_ReportApp = ReportApp;
  59. m_condition = ReportApp.m_conditionChoose;
  60. m_DataMgr = ReportApp.m_rstDataMgr;
  61. InitializeComponent();
  62. }
  63. /// <summary>
  64. /// 三角图,构造函数
  65. /// </summary>
  66. /// <param name="in_sec">传入,委托类对象</param>
  67. /// <param name="in_Cotsreportprojfilemgrclr">传入,项目管理类对象</param>
  68. public EChart_Trianglediagram(frmReportApp ReportApp, string Templates)
  69. {
  70. m_list_trianglejsonclass = new List<TriangleJsonClass>();
  71. m_list_string_sizelevel = new List<string>();
  72. m_list_string_samplename = new List<string>();
  73. m_old_list_string_sizelevel = new List<string>();
  74. Template = Templates;
  75. m_ReportApp = ReportApp;
  76. m_condition = ReportApp.m_conditionChoose;
  77. m_DataMgr = ReportApp.m_rstDataMgr;
  78. ReportExporting = true;
  79. InitializeComponent();
  80. }
  81. private void EChart_Trianglediagram_Load(object sender, EventArgs e)
  82. {
  83. TernaryData.Columns.Add("A");
  84. TernaryData.Columns.Add("B");
  85. TernaryData.Columns.Add("C");
  86. TernaryData.Columns.Add("DMAX");
  87. TernaryData.Columns.Add("DMIN");
  88. string template = Template;
  89. TernaryName.Clear();
  90. if (template == "")
  91. { //三元相图模板
  92. template = m_condition.m_conditionData.GetPropItemDisplayValueByPropItemName(OTS_REPORT_PROP_GRID_ITEMS.TRIO_CHART_TYPE).ToString();
  93. }
  94. //获取粒级表
  95. string pathtpf = Application.StartupPath + "\\Config\\ProData\\DefaultTriTemplateFile.tpf";
  96. List<string> nameList = new List<string>();
  97. DataSet ds = XMLoperate.GetXmlData(pathtpf, "XMLData");
  98. DataTable dt = ds.Tables["Member"];
  99. string TemplateName = "";
  100. //遍历第一层节点
  101. foreach (DataRow element in dt.Rows)
  102. {
  103. TemplateName = element["TemplateName"].ToString();
  104. if (TemplateName == template)
  105. {
  106. string Element = element["Element"].ToString();
  107. nameList.Add(Element.Split('.')[0]);
  108. nameList.Add(Element.Split('.')[1]);
  109. nameList.Add(Element.Split('.')[2]);
  110. TernaryName.Add(template.Split('.')[0]);
  111. TernaryName.Add(template.Split('.')[1]);
  112. TernaryName.Add(template.Split('.')[2]);
  113. break;
  114. }
  115. }
  116. //for (int i=0;i< nameList.Count;i++)
  117. //{
  118. // TernaryName.Add(nameList[i]);
  119. //}
  120. //将所有的测量结果名添加到list中
  121. m_list_string_samplename.Clear();
  122. string sou = "";
  123. int sel = 0;
  124. if (Report)
  125. {
  126. sou = m_DataMgr.ResultFilesList[m_DataMgr.GetWorkingResultId()].anotherFileName.ToString();
  127. if(ParticleRange)
  128. {
  129. sel = 0;
  130. }
  131. else
  132. {
  133. sel = 1;
  134. }
  135. }
  136. else
  137. {
  138. sou = m_condition.m_CurrentConditions[OTS_REPORT_PROP_GRID_ITEMS.DATA_SOURCE].itemDisplayVal.ToString();
  139. //判断颗粒范围(全部颗粒或者选择颗粒)
  140. sel = m_ReportApp.m_conditionChoose.m_conditionData.GetComboDownListIndexByItemName(OTS_REPORT_PROP_GRID_ITEMS.DATA_SOURCE_TYPE);
  141. }
  142. Report = false;
  143. if (sou.Contains("+"))
  144. {
  145. if (m_ReportApp.more)
  146. {
  147. m_ReportApp.trans = false;
  148. }
  149. else
  150. {
  151. m_ReportApp.trans = true;
  152. }
  153. for (int i = 0; i < sou.Split('+').Length; i++)
  154. {
  155. ResultFile resultFile = m_DataMgr.ResultFilesList.Find(s => s.anotherFileName == sou.Split('+')[i]);
  156. if (resultFile == null)
  157. {
  158. continue;
  159. }
  160. TriangleJsonClass cl = GettriangleJsonClass(resultFile.FilePath, resultFile.anotherFileName, nameList, TemplateName,sel);
  161. m_list_trianglejsonclass.Add(cl);
  162. }
  163. }
  164. else
  165. {
  166. if (!m_ReportApp.more)
  167. {
  168. m_ReportApp.trans = false;
  169. }
  170. else
  171. {
  172. m_ReportApp.trans = true;
  173. }
  174. m_ReportApp.more = false;
  175. ResultFile resultFile;
  176. int index = (int)m_condition.m_CurrentConditions[OTS_REPORT_PROP_GRID_ITEMS.DATA_SOURCE].itemVal;
  177. if (ReportExporting)
  178. {
  179. resultFile = m_DataMgr.ResultFilesList[m_DataMgr.GetWorkingResultId()];
  180. }
  181. else
  182. {
  183. //resultFile = m_DataMgr.ResultFilesList[m_DataMgr.GetWorkingResult()];
  184. resultFile = m_DataMgr.ResultFilesList[index];
  185. }
  186. ReportExporting = false;
  187. TriangleJsonClass cl = GettriangleJsonClass(resultFile.FilePath, resultFile.anotherFileName, nameList, TemplateName,sel);
  188. m_list_trianglejsonclass.Add(cl);
  189. }
  190. //使用EChart进行显示
  191. if (m_list_trianglejsonclass.Count > 1)
  192. {
  193. List<Chartdate> list = new List<Chartdate>();
  194. for (int i = 0; i < m_list_trianglejsonclass.Count; i++)
  195. {
  196. //拼写Json数据
  197. Chartdate list_json_str = SpellTriangleJson(m_list_trianglejsonclass[i]);
  198. list.Add(list_json_str);
  199. }
  200. url = "CefSharp\\Resources/HTML/chartsMore.html";
  201. m_ReportApp.data = JsonConvert.SerializeObject(list);
  202. }
  203. else
  204. {
  205. //拼写Json数据
  206. Chartdate list_json_str = SpellTriangleJson(m_list_trianglejsonclass[0]);
  207. url = "CefSharp\\Resources/HTML/charts.html";
  208. m_ReportApp.data = JsonConvert.SerializeObject(list_json_str);
  209. }
  210. InitBrowser();
  211. }
  212. private TriangleJsonClass GettriangleJsonClass(string path, string name, List<string> nameList, string templatename,int sel)
  213. {
  214. TernaryData.Rows.Clear();
  215. TriangleJsonClass triangleJsonClass = new TriangleJsonClass();
  216. m_list_string_samplename.Add(name);
  217. List<string> list_string_sort = new List<string>();
  218. List<double[]> list_point_sort = new List<double[]>();
  219. DataTable particles = GetParticles(path, nameList,sel);
  220. foreach (DataRow item in particles.Rows)
  221. {
  222. if (item["particleLocation"].ToString() == "0,0,0")
  223. {
  224. continue;
  225. }
  226. list_string_sort.Add(item["sizeLevel"].ToString());
  227. double top = Convert.ToDouble(item["top"]);
  228. double left = Convert.ToDouble(item["left"]);
  229. double right = Convert.ToDouble(item["right"]);
  230. //x=right+top/2,y=(√3/2)*top
  231. double Y = 0.866 * top * 100;
  232. double X = (right + top / 2) * 100;
  233. double[] point = { Math.Round(X, 2), Math.Round(Y) };
  234. list_point_sort.Add(point);
  235. DataRow dr = TernaryData.NewRow();
  236. dr["A"] = top.ToString();
  237. dr["B"] = left.ToString();
  238. dr["C"] = right.ToString();
  239. dr["DMAX"] = item["DMAX"].ToString();
  240. dr["DMIN"] = item["DMIN"].ToString();
  241. TernaryData.Rows.Add(dr);
  242. }
  243. triangleJsonClass = new TriangleJsonClass()
  244. {
  245. Samplename = name,
  246. TopName = templatename.Split('.')[0],
  247. LeftName = templatename.Split('.')[1],
  248. RightName = templatename.Split('.')[2],
  249. ListPartSize = list_string_sort,
  250. ListPointF = list_point_sort
  251. };
  252. return triangleJsonClass;
  253. }
  254. /// <summary>
  255. /// 导出Excel数据
  256. /// </summary>
  257. private void ExportExcelDocument()
  258. {
  259. // 创建一个SaveFileDialog实例
  260. SaveFileDialog saveFileDialog = new SaveFileDialog();
  261. // 设置对话框的标题
  262. saveFileDialog.Title = "选择Excel文件保存位置";
  263. // 设置默认的文件扩展名为.xlsx
  264. saveFileDialog.DefaultExt = "xlsx";
  265. // 设置过滤器,限制用户可以选择的文件类型为Excel文件
  266. saveFileDialog.Filter = "Excel文件 (*.xlsx)|*.xlsx";
  267. // 显示对话框并检查用户是否点击了“保存”按钮
  268. if (saveFileDialog.ShowDialog() == DialogResult.OK)
  269. {
  270. // 获取用户选择的文件路径
  271. string filePath = saveFileDialog.FileName;
  272. // 调用导出方法
  273. ExportDataTableToExcel(TernaryData, filePath);
  274. }
  275. }
  276. //获取颗粒信息
  277. private DataTable GetParticles(string filepath, List<string> nameList,int sel)
  278. {
  279. ParticleData particledata = new ParticleData(filepath);
  280. //设置标签名称
  281. List<string> listName = new List<string>();
  282. //获取粒级表
  283. string pathe = m_DataMgr.m_RptConfigFile.PartSizeFileFolder + m_DataMgr.m_RptConfigFile.PartSizeFile;
  284. DataSet ds = XMLoperate.GetXml(pathe);
  285. string sizestr = ds.Tables[0].Rows[0]["Sizes"].ToString();
  286. for (int i = 0; i < sizestr.Split(',').Length - 1; i++)
  287. {
  288. if (sizestr.Split(',')[i].Length > 0)
  289. {
  290. double d1 = Convert.ToDouble(sizestr.Split(',')[i]);
  291. double d2 = Convert.ToDouble(sizestr.Split(',')[i + 1]);
  292. listName.Add(d1.ToString() + "~" + d2.ToString());
  293. }
  294. }
  295. double d = Convert.ToDouble(sizestr.Split(',')[sizestr.Split(',').Length - 1]);
  296. listName.Add(d.ToString() + "~MAX");
  297. string filedAndParticl = "";
  298. string po = "";
  299. string con = "";
  300. int row = m_condition.m_conditionData.ConditionItemList.Count;
  301. if (condition != -1)
  302. {
  303. List<string> li = new List<string>() { "DMAX", "DMIN", "Area", "FERET" };
  304. con = li[condition];
  305. }
  306. else
  307. {
  308. if (row < 4)
  309. {
  310. con = "DMAX";
  311. }
  312. else
  313. {
  314. con = m_condition.m_conditionData.GetPropItemDisplayValueByPropItemName( OTS_REPORT_PROP_GRID_ITEMS.SIZE_CAL_METHOD_TYPE).ToString();
  315. }
  316. }
  317. switch (con)
  318. {
  319. case "DMAX":
  320. po = "DMAX";
  321. break;
  322. case "DMIN":
  323. po = "DMIN";
  324. break;
  325. case "ECD":
  326. po = "Area";
  327. break;
  328. case "FERET":
  329. po = "DFERET";
  330. break;
  331. }
  332. //particledata.GetParticleAllHaveXray("");
  333. //DataTable dtp = particledata.GetParticleHaveXray(filedAndParticl);//旧
  334. DataTable dtp = particledata.GetParticleAllHaveXray(filedAndParticl);//新
  335. //创建一个临时表
  336. DataTable ret_dt = new DataTable();
  337. //然后额外存放三列,用于存放拆分后三个顶点的值
  338. ret_dt.Columns.Add("sizeLevel");
  339. ret_dt.Columns.Add("particleLocation");
  340. ret_dt.Columns.Add("top");
  341. ret_dt.Columns.Add("left");
  342. ret_dt.Columns.Add("right");
  343. ret_dt.Columns.Add("Color_position");
  344. ret_dt.Columns.Add("DMAX");
  345. ret_dt.Columns.Add("DMIN");
  346. for (int k = 0; k < listName.Count; k++)
  347. {
  348. string str = listName[k];
  349. string d1 = str.Split('~')[0];
  350. string d2 = str.Split('~')[1];
  351. if (d2 == "MAX")
  352. {
  353. d2 = "999";
  354. }
  355. DataRow[] datas = dtp.Select(getWhere(d2, d1, po));
  356. foreach (var item in datas)
  357. {
  358. DataRow dr = ret_dt.NewRow();
  359. dr["sizeLevel"] = str;
  360. string element = item["Element"].ToString();
  361. string strRet = getStrRet(nameList, element);
  362. dr["particleLocation"] = strRet;
  363. dr["top"] = strRet.Split(',')[0];
  364. dr["left"] = strRet.Split(',')[1];
  365. dr["right"] = strRet.Split(',')[2];
  366. dr["Color_position"] = k.ToString();
  367. string strDMAX = item["DMAX"].ToString();
  368. string strDMIN = item["DMIN"].ToString();
  369. dr["DMAX"] = strDMAX;
  370. dr["DMIN"] = strDMIN;
  371. ret_dt.Rows.Add(dr);
  372. }
  373. }
  374. return ret_dt;
  375. }
  376. private string getWhere(string max, string min, string col)
  377. {
  378. return col + ">=" + min + " and " + col + "<=" + max;
  379. }
  380. private string getStrRet(List<string> template, string element)
  381. {
  382. List<string> name = new List<string>()
  383. { "h","he",
  384. "li","be","b","c","n","o","f","ne",
  385. "na","mg","al","si","p","s","cl","ar",
  386. "k","ca","sc","ti","v","cr","mn","fe","co","ni","cu","zn","ga","ge","as","se","br","kr",
  387. "rb","sr","y","zr","nb","mo","tc","ru","rh","pd","ag","cd","in","sn","sb","te","i","xe",
  388. "cs","ba","la",
  389. "ce","pr","nd","pm","sm","eu","gd","tb","dy","ho","er","tm","yb","lu",
  390. "hf","ta","w","re","os","ir","pt","au","hg","tl","pb","bi","po","at","rn",
  391. "fr","ra","ac",
  392. "th","pa","u","np","pu","am","cm","bk","cf","es","fm","md","no","lr"
  393. };
  394. List<double> value = new List<double>()
  395. { 1.008,4.003,
  396. 6.941,9.012,10.811,12.011,14.007,15.999,18.998,20.180,
  397. 22.990,24.305,26.982,28.086,30.974,32.066,35.453,39.948,
  398. 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,
  399. 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,
  400. 132.905,137.33,138.906,
  401. 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,
  402. 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,
  403. 223.00,226.025,227.028,
  404. 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
  405. };
  406. double d_ASum = 0;
  407. double d_BSum = 0;
  408. double d_CSum = 0;
  409. string aElements = template[0];
  410. string bElements = template[1];
  411. string cElements = template[2];
  412. foreach (var item in element.Split(';'))
  413. {
  414. if (item.Contains(aElements + "-"))
  415. {
  416. if (aElements != "")
  417. {
  418. d_ASum = Convert.ToDouble(item.Split('-')[1]) / value[name.IndexOf(aElements.ToLower())];
  419. }
  420. }
  421. for (int i = 0; i < bElements.Split(',').Length; i++)
  422. {
  423. string e = bElements.Split(',')[i];
  424. if (item.Contains(e + "-"))
  425. {
  426. d_BSum = d_BSum + Convert.ToDouble(item.Split('-')[1]) / value[name.IndexOf(e.ToLower())];
  427. }
  428. }
  429. if (item.Contains(cElements + "-"))
  430. {
  431. if (cElements != "")
  432. d_CSum = Convert.ToDouble(item.Split('-')[1]) / value[name.IndexOf(cElements.ToLower())];
  433. }
  434. }
  435. double allNums = d_ASum + d_BSum + d_CSum;
  436. string strRet = "";
  437. if ((allNums) == 0)
  438. {
  439. strRet = "0,0,0";
  440. }
  441. else
  442. {
  443. double aPercent = 0, bPercent = 0, cPercent = 0;
  444. if (d_ASum != 0)
  445. {
  446. aPercent = d_ASum / allNums;
  447. }
  448. if (d_BSum != 0)
  449. {
  450. bPercent = d_BSum / allNums;
  451. }
  452. if (d_CSum != 0)
  453. {
  454. cPercent = d_CSum / allNums;
  455. }
  456. strRet = aPercent.ToString() + "," + bPercent.ToString() + "," + cPercent.ToString();
  457. }
  458. return strRet;
  459. }
  460. class Chartdate
  461. {
  462. public string Samplename { get; set; }
  463. public string LeftName { get; set; }
  464. public string RightName { get; set; }
  465. public string TopName { get; set; }
  466. public List<string> ListPartSize { get; set; }
  467. public List<List<double[]>> ListPoint { get; set; }
  468. }
  469. #endregion
  470. #region echarts
  471. //定义图片
  472. //JsEvent js;
  473. //定义图片base64
  474. public string pic { get; set; }
  475. //定义图形类型
  476. public string type { get; set; }
  477. //获取图片
  478. private void button1_Click(object sender, EventArgs e)
  479. {
  480. //string str = GetPic();
  481. //pic = str;
  482. }
  483. /// <summary>
  484. /// 加载浏览器
  485. /// </summary>
  486. public void InitBrowser()
  487. {
  488. //加载网页
  489. if (m_ReportApp.browser_trio == null || m_ReportApp.trans)
  490. {
  491. // 获取生成路径下网页文件的绝对路径
  492. string fileName = Path.Combine(Directory.GetCurrentDirectory(), url);
  493. //加载网页
  494. m_ReportApp.browser_trio = new ChromiumWebBrowser(fileName);
  495. //禁止网页
  496. m_ReportApp.browser_trio.MenuHandler = new MenuHandler();
  497. m_ReportApp.browser_trio.Dock = DockStyle.Fill;
  498. //添加网页到当前自定义控件
  499. //this.Controls.Add(m_ReportApp.browser_trio);
  500. this.panel1.Controls.Add(m_ReportApp.browser_trio);
  501. m_ReportApp.js.MessageText = "";
  502. //供页面调用以传递数据
  503. m_ReportApp.browser_trio.RegisterJsObject("jsObj", m_ReportApp.js, false);
  504. //升级cef版本后新方法
  505. //CefSharpSettings.LegacyJavascriptBindingEnabled = true;
  506. //CefSharpSettings.WcfEnabled = true;
  507. //m_ReportApp.browser_trio.JavascriptObjectRepository.Register("jsObj", m_ReportApp.js, isAsync: false, options: BindingOptions.DefaultBinder);
  508. //网页加载结束后调用事件
  509. m_ReportApp.browser_trio.FrameLoadEnd += WebBrowser_FrameLoadEnd;
  510. }
  511. else
  512. {
  513. m_ReportApp.browser_trio.ResetText();
  514. m_ReportApp.browser_trio.Reload();
  515. m_ReportApp.browser_trio.Refresh();
  516. //供页面调用以传递数据
  517. //this.Controls.Add(m_ReportApp.browser_trio);
  518. this.panel1.Controls.Add(m_ReportApp.browser_trio);
  519. }
  520. if (m_ReportApp.timerKG)
  521. {
  522. timer1.Enabled = true;
  523. }
  524. }
  525. /// <summary>
  526. /// 页面加载结束后事件
  527. /// </summary>
  528. /// <param name="sender"></param>
  529. /// <param name="e"></param>
  530. private void WebBrowser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e)
  531. {
  532. if (e.Frame.IsMain)
  533. {
  534. //为页面图形提供数据参数
  535. string str = m_ReportApp.data;
  536. //执行网页脚本事件
  537. m_ReportApp.browser_trio.ExecuteScriptAsync("showchart('" + str + "','','triangle')");
  538. }
  539. }
  540. private void ExportDataTableToExcel(DataTable dataTable, string filePath)
  541. {
  542. // 创建一个新的工作簿
  543. IWorkbook workbook = new XSSFWorkbook(); // 对于.xlsx格式
  544. // IWorkbook workbook = new HSSFWorkbook(); // 对于.xls格式
  545. // 添加一个新的工作表
  546. ISheet sheet = workbook.CreateSheet("Sheet1");
  547. // 创建表头行(第一行)
  548. IRow headerRow = sheet.CreateRow(0);
  549. ICell cell1 = headerRow.CreateCell(0);
  550. cell1.SetCellValue(TernaryName[0].ToString());
  551. ICell cell2 = headerRow.CreateCell(1);
  552. cell2.SetCellValue(TernaryName[1].ToString());
  553. ICell cell3 = headerRow.CreateCell(2);
  554. cell3.SetCellValue(TernaryName[2].ToString());
  555. ICell cell4 = headerRow.CreateCell(3);
  556. cell4.SetCellValue("DMAX");
  557. ICell cell5 = headerRow.CreateCell(4);
  558. cell5.SetCellValue("DMIN");
  559. //for (int i = 0; i < dataTable.Columns.Count; i++)
  560. //{
  561. // ICell cell = headerRow.CreateCell(i);
  562. // cell.SetCellValue(dataTable.Columns[i].ColumnName);
  563. //}
  564. // 填充数据行
  565. for (int i = 0; i < dataTable.Rows.Count; i++)
  566. {
  567. IRow row = sheet.CreateRow(i + 1);
  568. for (int j = 0; j < dataTable.Columns.Count; j++)
  569. {
  570. ICell cell = row.CreateCell(j);
  571. if (dataTable.Rows[i][j] != DBNull.Value)
  572. {
  573. cell.SetCellValue(dataTable.Rows[i][j].ToString());
  574. }
  575. }
  576. }
  577. // 自动调整列宽(可选)
  578. // 注意:NPOI的AutoSizeColumn方法不如EPPlus的AutoFitColumns方法那样精确
  579. // 你可能需要手动设置列宽或者接受默认的宽度
  580. // 但以下是一个尝试自动调整列宽的示例,它可能不完全符合你的期望
  581. for (int i = 0; i < dataTable.Columns.Count; i++)
  582. {
  583. sheet.AutoSizeColumn(i);
  584. // 或者,你可以设置一个固定的宽度(以字符为单位)
  585. // sheet.SetColumnWidth(i, 20 * 256); // 20是字符宽度,256是转换因子
  586. }
  587. // 保存Excel文件
  588. using (FileStream fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
  589. {
  590. workbook.Write(fileStream);
  591. }
  592. // 释放资源(对于.xlsx格式,通常不需要显式调用Dispose,因为XSSFWorkbook实现了IDisposable但内部已经处理了资源释放)
  593. // 但为了良好的编程习惯,你可以显式调用(尽管这里不是必需的)
  594. // workbook.Dispose(); // 如果你使用的是实现了IDisposable的对象,并且想确保资源被释放
  595. }
  596. //public string GetPic()
  597. //{
  598. // return js.MessageText;
  599. //}
  600. //禁止网页操作,右键点击等
  601. class MenuHandler : CefSharp.IContextMenuHandler
  602. {
  603. void CefSharp.IContextMenuHandler.OnBeforeContextMenu(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame, CefSharp.IContextMenuParams parameters, CefSharp.IMenuModel model)
  604. {
  605. model.Clear();
  606. }
  607. bool CefSharp.IContextMenuHandler.OnContextMenuCommand(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame, CefSharp.IContextMenuParams parameters, CefSharp.CefMenuCommand commandId, CefSharp.CefEventFlags eventFlags)
  608. {
  609. //throw new NotImplementedException();
  610. return false;
  611. }
  612. void CefSharp.IContextMenuHandler.OnContextMenuDismissed(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame)
  613. {
  614. //throw new NotImplementedException();
  615. }
  616. bool CefSharp.IContextMenuHandler.RunContextMenu(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame, CefSharp.IContextMenuParams parameters, CefSharp.IMenuModel model, CefSharp.IRunContextMenuCallback callback)
  617. {
  618. return false;
  619. }
  620. }
  621. class JsEvent
  622. {
  623. public string MessageText { set; get; }
  624. public void ShowTest()
  625. {
  626. MessageBox.Show(MessageText);
  627. }
  628. }
  629. #endregion
  630. #region 自定义方法
  631. /// <summary>
  632. /// 拼写json数据
  633. /// </summary>
  634. /// <returns></returns>
  635. private Chartdate SpellTriangleJson(TriangleJsonClass in_trianglejsonclass)
  636. {
  637. Chartdate chart = new Chartdate();
  638. chart.LeftName = in_trianglejsonclass.LeftName;
  639. chart.RightName = in_trianglejsonclass.RightName;
  640. chart.TopName = in_trianglejsonclass.TopName;
  641. chart.Samplename = in_trianglejsonclass.Samplename;
  642. List<string> str_listpartsize = new List<string>();
  643. List<List<double[]>> str_listpoint = new List<List<double[]>>();
  644. for (int i = 0; i < in_trianglejsonclass.ListPartSize.Count; i++)
  645. {
  646. //如果未包含该粒级
  647. if (!str_listpartsize.Contains(in_trianglejsonclass.ListPartSize[i]))
  648. {
  649. //第一步先添加该粒级
  650. str_listpartsize.Add(in_trianglejsonclass.ListPartSize[i]);
  651. }
  652. }
  653. //第二步再添加所有该粒级对应的坐标,到一个分组中
  654. for (int i = 0; i < str_listpartsize.Count; i++)
  655. {
  656. List<double[]> point = new List<double[]>();
  657. for (int k = 0; k < in_trianglejsonclass.ListPointF.Count; k++)
  658. {
  659. if (str_listpartsize[i] == in_trianglejsonclass.ListPartSize[k])
  660. {
  661. point.Add(in_trianglejsonclass.ListPointF[k]);
  662. }
  663. }
  664. str_listpoint.Add(point);
  665. }
  666. chart.ListPartSize = str_listpartsize;
  667. chart.ListPoint = str_listpoint;
  668. return chart;
  669. }
  670. #endregion
  671. #region EChart导出图像委托调用部份
  672. public delegate void MyDelgate(string va);
  673. public event MyDelgate butclic;
  674. private void timer1_Tick(object sender, EventArgs e)
  675. {
  676. if (butclic == null)
  677. return;
  678. if (m_ReportApp.js == null)
  679. return;
  680. if (m_ReportApp.js.MessageText == null)
  681. return;
  682. if (m_ReportApp.js.MessageText != "")
  683. {
  684. butclic(m_ReportApp.js.MessageText);
  685. timer1.Enabled = false;
  686. m_ReportApp.timerKG = false;
  687. m_ReportApp.js.MessageText = "";
  688. }
  689. }
  690. [DataContract]
  691. public class TriangleJsonClass
  692. {
  693. [DataMember]
  694. public string Samplename { set; get; }
  695. [DataMember]
  696. public string TopName { set; get; }
  697. [DataMember]
  698. public string LeftName { set; get; }
  699. [DataMember]
  700. public string RightName { set; get; }
  701. [DataMember]
  702. public List<string> ListPartSize { set; get; }
  703. [DataMember]
  704. public List<double[]> ListPointF { set; get; }
  705. }
  706. #endregion
  707. private void button1_Click_1(object sender, EventArgs e)
  708. {
  709. ExportExcelDocument();
  710. }
  711. }
  712. }