You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

942 lines
37 KiB

  1. using Newtonsoft.Json.Linq;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Data;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Reflection;
  8. using System.Text;
  9. using System.Web;
  10. namespace NFine.Web
  11. {
  12. public class PrintJson
  13. {
  14. /// <summary>
  15. /// 打印的JSON数据
  16. /// </summary>
  17. private JObject jPrintValue;
  18. /// <summary>
  19. /// 打印的参数,每个数组包括两个值:Key, Value
  20. /// </summary>
  21. private JArray jaryPrintParam;
  22. /// <summary>
  23. /// 打印预览时的按钮是否显示
  24. /// </summary>
  25. private JObject jButtonHide;
  26. /// <summary>
  27. /// 设置页边距
  28. /// </summary>
  29. private JObject jMargin;
  30. /// <summary>
  31. /// 设置数据集的名称
  32. /// </summary>
  33. private JObject jDataSetName;
  34. /// <summary>
  35. /// 打印的单个图片的数组,包含3个元素:报表图片对象名、图片文件名、 图片文件内容
  36. /// </summary>
  37. private JArray jaryPictureSingle;
  38. /// <summary>
  39. /// 打印的数据集中的图片的内容的数组,包含2个元素:图片文件名称、图片文件内容
  40. /// </summary>
  41. private JArray jaryPictureTableValue;
  42. /// <summary>
  43. /// 打印的数据集中的图片的设置的数组,包含3个元素:报表图片对象名、数据集序号、字段名称
  44. /// </summary>
  45. private JArray jaryPictureTableSet;
  46. /// <summary>
  47. /// 打印的数据内容的数组
  48. /// </summary>
  49. private JArray jaryPrintData;
  50. /// <summary>
  51. /// 控件注册的姓名或公司名称
  52. /// </summary>
  53. private string strRegName;
  54. /// <summary>
  55. /// 控件的注册码
  56. /// </summary>
  57. private string strRegValue;
  58. /// <summary>
  59. /// 报表文件名称,包括绝对路径
  60. /// </summary>
  61. private string strReportFileName;
  62. /// <summary>
  63. /// 报表临时文件所在的文件夹,服务器的报表JSON数据将临时存储在此文件夹,此文件夹要求能通过URL访问,控件通过文件名下载报表打印所需要的数据
  64. /// </summary>
  65. private string strReportTempDirectory;
  66. /// <summary>
  67. /// 存储打印控件时初始化时,所传入的Cookie值、回传服务端的URL
  68. /// </summary>
  69. private JObject jCookieUrl;
  70. /// <summary>
  71. /// 打印初始化类
  72. /// </summary>
  73. /// <param name="_strReportTempDirectory">报表临时文件所在的文件夹,服务器的报表JSON数据将临时存储在此文件夹,此文件夹要求能通过URL访问,控件通过文件名下载报表打印所需要的数据</param>
  74. /// <param name="_strReportFileName">报表文件名称,包括绝对路径</param>
  75. public PrintJson(string _strReportTempDirectory, string _strReportFileName)
  76. {
  77. jPrintValue = new JObject();
  78. jaryPrintParam = new JArray();
  79. jButtonHide = new JObject();
  80. jMargin = new JObject();
  81. jDataSetName = new JObject();
  82. jaryPictureSingle = new JArray();
  83. jaryPictureTableValue = new JArray();
  84. jaryPictureTableSet = new JArray();
  85. jaryPrintData = new JArray();
  86. jCookieUrl = new JObject();
  87. this.strReportTempDirectory = _strReportTempDirectory;
  88. if (this.strReportTempDirectory != "")
  89. {
  90. if (strReportTempDirectory.Substring(strReportTempDirectory.Length - 1, 1) != "\\")
  91. {
  92. strReportTempDirectory = strReportTempDirectory + "\\";
  93. }
  94. }
  95. if (!Directory.Exists(strReportTempDirectory))
  96. {
  97. Directory.CreateDirectory(strReportTempDirectory);
  98. }
  99. this.strReportFileName = _strReportFileName;
  100. }
  101. /// <summary>
  102. /// 输入控件注册的信息,检查注册
  103. /// </summary>
  104. /// <param name="_strRegName">控件注册的姓名或公司名称</param>
  105. /// <param name="_strRegValue">控件的注册码</param>
  106. public void CheckRegister(string _strRegName, string _strRegValue)
  107. {
  108. this.strRegName = _strRegName;
  109. this.strRegValue = _strRegValue;
  110. }
  111. /// <summary>
  112. /// 设置控件初始化后,需要上传的Cookie,以及回传的服务器URL
  113. /// 服务端调用控件之前,判断是否有 Cookie(此Cookie为GuId值,保证唯一性,此Cookie的保存时间为10年以上),若有Cookie则在服务端的数据表中查找,判断是否有记录,若有记录,则表示此电脑已经安装过。 若没有记录,或者没有Cookie,则表示未安装过。若没有Cookie则建立一个Cookie。
  114. /// 调用控件时,把此Cookie,还有Cookie回传的服务端的URL传给控件。控件在运行时,把此cookie值回传服务器,服务器把此Cookie写入数据表中,并且更新最后一次回调的时间
  115. /// 浏览器在调用控件之后,可以再启动一个延时(比如延时3秒)函数,以Ajax去访问服务端(参数:Cookie值),服务端去读取数据表的此Cookie的记录,若不存在记录,或最后访问的时间超过了规定时间,则判断为客户机没有安装,提示下载安装。
  116. /// </summary>
  117. /// <param name="strCookie">此Cookie值由服务器生成,最好是GUID,保证唯一性</param>
  118. /// <param name="strServerGetUrl">回传的服务器URL,是Get方式</param>
  119. public void SetCookieAndURL(string strCookie, string strServerGetUrl)
  120. {
  121. if (strCookie != "" && strServerGetUrl.ToLower().Contains("http"))
  122. {
  123. jCookieUrl.Add(new JProperty("Cookie", strCookie));
  124. jCookieUrl.Add(new JProperty("ServerUrl", strServerGetUrl));
  125. }
  126. }
  127. /// <summary>
  128. /// 增加打印的参数
  129. /// </summary>
  130. /// <param name="strKey">参数名</param>
  131. /// <param name="strValue">参数值</param>
  132. public void AddPrintParam(string strKey, string strValue)
  133. {
  134. JObject jParam = new JObject();
  135. jParam.Add(new JProperty("Key", strKey));
  136. jParam.Add(new JProperty("Value", strValue));
  137. jaryPrintParam.Add(jParam);
  138. }
  139. /// <summary>
  140. /// 在线编辑报表时,设置报表的文件名
  141. /// </summary>
  142. /// <param name="strReportFileName"></param>
  143. public void SetReportFileName(string strReportFileName)
  144. {
  145. jPrintValue.Add(new JProperty("ReportFileName", strReportFileName));
  146. }
  147. /// <summary>
  148. /// 在线编辑报表时,设置Web服务器接收保存报表数据的URL
  149. /// 公司版本才有此功能,个人版本无此功能
  150. /// </summary>
  151. /// <param name="strPostUrl"></param>
  152. public void SetPostUrl(string strPostUrl)
  153. {
  154. jPrintValue.Add(new JProperty("PostUrl", strPostUrl));
  155. }
  156. /// <summary>
  157. /// 在报表预览时,点击页面设置按钮,所设置的页面设置信息可通过此URL上传至Web服务器保存
  158. /// </summary>
  159. /// <param name="strPageSetUrl"></param>
  160. public void SetPageSetUrl(string strPageSetUrl)
  161. {
  162. jPrintValue.Add(new JProperty("PageSetUrl", strPageSetUrl));
  163. }
  164. /// <summary>
  165. /// 在报表打印时,在弹出的选择打印机的窗口后点击“确定”按钮时,通过Http的Post方式直接提交到所设置的URL页面,用户可以在URL处理用户已打印的份数
  166. /// </summary>
  167. /// <param name="strPrintUrl"></param>
  168. public void SetPrintUrl(string strPrintUrl)
  169. {
  170. jPrintValue.Add(new JProperty("PrintUrl", strPrintUrl));
  171. }
  172. /// <summary>
  173. /// 指定打印时的打印机名称
  174. /// </summary>
  175. /// <param name="strPrinter"></param>
  176. public void SetPrinter(string strPrinter)
  177. {
  178. jPrintValue.Add(new JProperty("Printer", strPrinter));
  179. }
  180. /// <summary>
  181. /// 报表打印预览窗口隐藏按钮:打印
  182. /// 公司版本才有此功能,个人版本无此功能
  183. /// </summary>
  184. public void IsHideButtonPrint()
  185. {
  186. jButtonHide.Add(new JProperty("pbPrint", false));
  187. }
  188. /// <summary>
  189. /// 报表打印预览窗口隐藏按钮:打开文件
  190. /// 公司版本才有此功能,个人版本无此功能
  191. /// </summary>
  192. public void IsHideButtonLoad()
  193. {
  194. jButtonHide.Add(new JProperty("pbLoad", false));
  195. }
  196. /// <summary>
  197. /// 报表打印预览窗口隐藏按钮:保存
  198. /// 公司版本才有此功能,个人版本无此功能
  199. /// </summary>
  200. public void IsHideButtonSave()
  201. {
  202. jButtonHide.Add(new JProperty("pbSave", false));
  203. }
  204. /// <summary>
  205. /// 报表打印预览窗口隐藏按钮:导出
  206. /// 公司版本才有此功能,个人版本无此功能
  207. /// </summary>
  208. public void IsHideButtonExport()
  209. {
  210. jButtonHide.Add(new JProperty("pbExport", false));
  211. }
  212. /// <summary>
  213. /// 报表打印预览窗口隐藏按钮:放大缩小
  214. /// 公司版本才有此功能,个人版本无此功能
  215. /// </summary>
  216. public void IsHideButtonZoom()
  217. {
  218. jButtonHide.Add(new JProperty("pbZoom", false));
  219. }
  220. /// <summary>
  221. /// 报表打印预览窗口隐藏按钮:查找
  222. /// 公司版本才有此功能,个人版本无此功能
  223. /// </summary>
  224. public void IsHideButtonFind()
  225. {
  226. jButtonHide.Add(new JProperty("pbFind", false));
  227. }
  228. /// <summary>
  229. /// 报表打印预览窗口隐藏按钮:大纲显示
  230. /// 公司版本才有此功能,个人版本无此功能
  231. /// </summary>
  232. public void IsHideButtonOutline()
  233. {
  234. jButtonHide.Add(new JProperty("pbOutline", false));
  235. }
  236. /// <summary>
  237. /// 报表打印预览窗口隐藏按钮:页面设置
  238. /// 公司版本才有此功能,个人版本无此功能
  239. /// </summary>
  240. public void IsHideButtonPageSetup()
  241. {
  242. jButtonHide.Add(new JProperty("pbPageSetup", false));
  243. }
  244. /// <summary>
  245. /// 报表打印预览窗口隐藏按钮:页面导航
  246. /// 公司版本才有此功能,个人版本无此功能
  247. /// </summary>
  248. public void IsHideButtonNavigator()
  249. {
  250. jButtonHide.Add(new JProperty("pbNavigator", false));
  251. }
  252. /// <summary>
  253. /// 报表打印预览窗口隐藏按钮:快速导出
  254. /// 公司版本才有此功能,个人版本无此功能
  255. /// </summary>
  256. public void IsHideButtonExportQuick()
  257. {
  258. jButtonHide.Add(new JProperty("pbExportQuick", false));
  259. }
  260. /// <summary>
  261. /// 设置页面设置的左边距,单位为毫米
  262. /// 公司版本才有此功能,个人版本无此功能
  263. /// </summary>
  264. /// <param name="iMargin"></param>
  265. public void SetLeftMargin(double dbLeftMargin)
  266. {
  267. jMargin.Add(new JProperty("LeftMargin", dbLeftMargin));
  268. }
  269. /// <summary>
  270. /// 设置页面设置的右边距,单位为毫米
  271. /// 公司版本才有此功能,个人版本无此功能
  272. /// </summary>
  273. /// <param name="iMargin"></param>
  274. public void SetRightMargin(int dbRightMargin)
  275. {
  276. jMargin.Add(new JProperty("RightMargin", dbRightMargin));
  277. }
  278. /// <summary>
  279. /// 设置页面设置的上边距,单位为毫米
  280. /// 公司版本才有此功能,个人版本无此功能
  281. /// </summary>
  282. /// <param name="iMargin"></param>
  283. public void SetTopMargin(int dbTopMargin)
  284. {
  285. jMargin.Add(new JProperty("TopMargin", dbTopMargin));
  286. }
  287. /// <summary>
  288. /// 设置页面设置的下边距,单位为毫米
  289. /// 公司版本才有此功能,个人版本无此功能
  290. /// </summary>
  291. /// <param name="iMargin"></param>
  292. public void SetBottomMargin(int dbBottomMargin)
  293. {
  294. jMargin.Add(new JProperty("BottomMargin", dbBottomMargin));
  295. }
  296. /// <summary>
  297. /// 设置数据集1的名称为指定名称(可以是中文)
  298. /// 公司版本才有此功能,个人版本无此功能
  299. /// </summary>
  300. /// <param name="strDataSetName"></param>
  301. public void SetDataSetName1(string strDataSetName)
  302. {
  303. jDataSetName.Add(new JProperty("DataSetName1", strDataSetName));
  304. }
  305. /// <summary>
  306. /// 设置数据集2的名称为指定名称(可以是中文)
  307. /// 公司版本才有此功能,个人版本无此功能
  308. /// </summary>
  309. /// <param name="strDataSetName"></param>
  310. public void SetDataSetName2(string strDataSetName)
  311. {
  312. jDataSetName.Add(new JProperty("DataSetName2", strDataSetName));
  313. }
  314. /// <summary>
  315. /// 设置数据集3的名称为指定名称(可以是中文)
  316. /// 公司版本才有此功能,个人版本无此功能
  317. /// </summary>
  318. /// <param name="strDataSetName"></param>
  319. public void SetDataSetName3(string strDataSetName)
  320. {
  321. jDataSetName.Add(new JProperty("DataSetName3", strDataSetName));
  322. }
  323. /// <summary>
  324. /// 设置数据集4的名称为指定名称(可以是中文)
  325. /// 公司版本才有此功能,个人版本无此功能
  326. /// </summary>
  327. /// <param name="strDataSetName"></param>
  328. public void SetDataSetName4(string strDataSetName)
  329. {
  330. jDataSetName.Add(new JProperty("DataSetName4", strDataSetName));
  331. }
  332. /// <summary>
  333. /// 设置数据集5的名称为指定名称(可以是中文)
  334. /// 公司版本才有此功能,个人版本无此功能
  335. /// </summary>
  336. /// <param name="strDataSetName"></param>
  337. public void SetDataSetName5(string strDataSetName)
  338. {
  339. jDataSetName.Add(new JProperty("DataSetName5", strDataSetName));
  340. }
  341. /// <summary>
  342. /// 设置数据集6的名称为指定名称(可以是中文)
  343. /// 公司版本才有此功能,个人版本无此功能
  344. /// </summary>
  345. /// <param name="strDataSetName"></param>
  346. public void SetDataSetName6(string strDataSetName)
  347. {
  348. jDataSetName.Add(new JProperty("DataSetName6", strDataSetName));
  349. }
  350. /// <summary>
  351. /// 建立数据集的主从关系
  352. /// </summary>
  353. /// <param name="iMasterDataSeq">主数据集序号,通常为1</param>
  354. /// <param name="strFieldName">关联字段名为两个数据集共同的字段名</param>
  355. /// <param name="bIsNumber">关联的字段是否为数值型</param>
  356. public void MasterOptions(int iMasterDataSeq, string strFieldName, bool bIsNumber)
  357. {
  358. JObject jMasterOptions = new JObject();
  359. jMasterOptions.Add(new JProperty("MasterDataSeq", iMasterDataSeq));
  360. jMasterOptions.Add(new JProperty("FieldName", strFieldName));
  361. jMasterOptions.Add(new JProperty("IsNumber", bIsNumber));
  362. jPrintValue.Add("MasterOptions", jMasterOptions);
  363. }
  364. /// <summary>
  365. /// 增加单张图片打印
  366. /// </summary>
  367. /// <param name="strReportObjectName">在报表中的图片对象名称</param>
  368. /// <param name="strPictureFilePath">图片文件的绝对路径,包括最后的\</param>
  369. /// <param name="strPictureFileName">图片文件名称</param>
  370. public void AddPictureSinglePrint(string strReportObjectName, string strPictureFileName, string strPictureFilePath)
  371. {
  372. if (!strPictureFilePath.EndsWith("\\"))
  373. {
  374. strPictureFilePath = strPictureFilePath + "\\";
  375. }
  376. string strFileValue = PrintFunction.FileToString(strPictureFilePath + strPictureFileName);
  377. if (strFileValue != "")
  378. {
  379. JObject jPicture = new JObject();
  380. jPicture.Add(new JProperty("ReportObjectName", strReportObjectName));
  381. jPicture.Add(new JProperty("PictureFileName", strPictureFileName));
  382. jPicture.Add(new JProperty("PictureFileValue", strFileValue));
  383. jaryPictureSingle.Add(jPicture);
  384. }
  385. }
  386. /// <summary>
  387. /// 增加List数据中图片字段所对应的图片打印
  388. /// </summary>
  389. /// <typeparam name="T">List的类名</typeparam>
  390. /// <param name="strReportObjectName">在报表中的图片对象名称</param>
  391. /// <param name="listData">list数据内容</param>
  392. /// <param name="iDataSetIndex">该list中所有数据集的序号,从1开始</param>
  393. /// <param name="strFieldName">图片所在的字段名</param>
  394. /// <param name="strFilePath">图片在服务器上的绝对路径</param>
  395. public void AddPictureIListToPrint<T>(string strReportObjectName, IList<T> listData, int iDataSetIndex, string strFieldName, string strFilePath)
  396. {
  397. //增加图片打印的设置信息
  398. JObject jPictureSet = new JObject();
  399. jPictureSet.Add(new JProperty("ReportObjectName", strReportObjectName));
  400. jPictureSet.Add(new JProperty("DataSetIndex", iDataSetIndex));
  401. jPictureSet.Add(new JProperty("FieldName", strFieldName));
  402. jaryPictureTableSet.Add(jPictureSet);
  403. //利用反射找到图片字段的索引号
  404. Type pDataType = listData[0].GetType();
  405. int iPictureFieldCol = -1;
  406. PropertyInfo[] aryColumnes = pDataType.GetProperties();
  407. for (int iColRecn = 0; iColRecn < aryColumnes.Length; iColRecn++)
  408. {
  409. if (strFieldName.Trim() == aryColumnes[iColRecn].Name.Trim())
  410. {
  411. iPictureFieldCol = iColRecn;
  412. break;
  413. }
  414. }
  415. if (iPictureFieldCol < 0)
  416. {
  417. return;
  418. }
  419. //取各行的图片文件的值,写入JSON数组中
  420. for (int iRowRecn = 0; iRowRecn < listData.Count; iRowRecn++)
  421. {
  422. string strPictureFileName = aryColumnes[iPictureFieldCol].GetValue(listData[iRowRecn], null).ToString();
  423. if (strPictureFileName == "")
  424. {
  425. continue;
  426. }
  427. string strPictureValue = PrintFunction.FileToString(strFilePath + strPictureFileName);
  428. if (strPictureValue != "")
  429. {
  430. JObject jPicture = new JObject();
  431. jPicture.Add(new JProperty("PictureFileName", strPictureFileName));
  432. jPicture.Add(new JProperty("PictureFileValue", strPictureValue));
  433. jaryPictureTableValue.Add(jPicture);
  434. }
  435. }
  436. }
  437. /// <summary>
  438. /// 增加DataTable中图片字段所对应的图片打印
  439. /// </summary>
  440. /// <param name="strReportObjectName">在报表中的图片对象名称</param>
  441. /// <param name="dtTable">Table数据内容</param>
  442. /// <param name="iDataSetIndex">该table中所有数据集的序号,从1开始</param>
  443. /// <param name="strFieldName">图片所在的字段名</param>
  444. /// <param name="strFilePath">图片在服务器上的绝对路径</param>
  445. public void AddPictureTableToPrint(string strReportObjectName, DataTable dtTable, int iDataSetIndex, string strFieldName, string strFilePath)
  446. {
  447. //增加图片打印的设置信息
  448. JObject jPictureSet = new JObject();
  449. jPictureSet.Add(new JProperty("ReportObjectName", strReportObjectName));
  450. jPictureSet.Add(new JProperty("DataSetIndex", iDataSetIndex));
  451. jPictureSet.Add(new JProperty("FieldName", strFieldName));
  452. jaryPictureTableSet.Add(jPictureSet);
  453. //取各行的图片文件的值,写入JSON数组中
  454. if (!strFilePath.EndsWith("\\"))
  455. {
  456. strFilePath = strFilePath + "\\";
  457. }
  458. foreach (DataRow pRow in dtTable.Rows)
  459. {
  460. string strPictureFileName = pRow[strFieldName].ToString().Trim();
  461. if (strPictureFileName == "")
  462. {
  463. continue;
  464. }
  465. string strPictureValue = PrintFunction.FileToString(strFilePath + strPictureFileName);
  466. if (strPictureValue != "")
  467. {
  468. JObject jPicture = new JObject();
  469. jPicture.Add(new JProperty("PictureFileName", strPictureFileName));
  470. jPicture.Add(new JProperty("PictureFileValue", strPictureValue));
  471. jaryPictureTableValue.Add(jPicture);
  472. }
  473. }
  474. }
  475. /// <summary>
  476. /// 增加打印的数据集,数据类型:List
  477. /// </summary>
  478. /// <typeparam name="T">List的类名</typeparam>
  479. /// <param name="listData">list数据内容</param>
  480. public void AddPrintDataIList<T>(IList<T> listData)
  481. {
  482. string strPrintValue = PrintFunction.ListToXml<T>(listData);
  483. if (strPrintValue != "")
  484. {
  485. jaryPrintData.Add(strPrintValue);
  486. }
  487. }
  488. /// <summary>
  489. /// 增加打印的数据集,数据类型:Table
  490. /// </summary>
  491. /// <param name="dtTable">数据内容,此Table需要取得数据结构,即在填充数据集之前,先调用:da.FillSchema(ds, SchemaType.Source);</param>
  492. public void AddPrintDataTable(DataTable dtTable)
  493. {
  494. string strPrintValue = PrintFunction.TableToXml(dtTable);
  495. if (strPrintValue != "")
  496. {
  497. jaryPrintData.Add(strPrintValue);
  498. }
  499. }
  500. /// <summary>
  501. /// 预览报表,在打印之前先调用了 AddPrintDataIList 或 AddPrintDataTable 增加好了数据集
  502. /// </summary>
  503. public string ShowReport()
  504. {
  505. if (jaryPrintData.Count == 0)
  506. {
  507. throw new Exception("没有数据集");
  508. }
  509. jPrintValue.Add(new JProperty("Method", "ShowReport"));
  510. return CallPrint();
  511. }
  512. /// <summary>
  513. /// 预览报表,1个List数据
  514. /// </summary>
  515. /// <typeparam name="T"></typeparam>
  516. /// <param name="listData"></param>
  517. public string ShowReport<T>(IList<T> listData)
  518. {
  519. AddPrintDataIList<T>(listData);
  520. jPrintValue.Add(new JProperty("Method", "ShowReport"));
  521. return CallPrint();
  522. }
  523. /// <summary>
  524. /// 预览报表:2个List数据
  525. /// </summary>
  526. /// <typeparam name="T"></typeparam>
  527. /// <typeparam name="S"></typeparam>
  528. /// <param name="listData1"></param>
  529. /// <param name="listData2"></param>
  530. public string ShowReport<T, S>(IList<T> listData1, IList<S> listData2)
  531. {
  532. AddPrintDataIList<T>(listData1);
  533. AddPrintDataIList<S>(listData2);
  534. jPrintValue.Add(new JProperty("Method", "ShowReport"));
  535. return CallPrint();
  536. }
  537. /// <summary>
  538. /// 预览报表:多个Table数据
  539. /// </summary>
  540. /// <param name="dtTable1">此Table需要取得数据结构,即在填充数据集之前,先调用:da.FillSchema(ds, SchemaType.Source);</param>
  541. /// <param name="dtTable2">Table数据,可不填</param>
  542. /// <param name="dtTable3">Table数据,可不填</param>
  543. /// <param name="dtTable4">Table数据,可不填</param>
  544. /// <param name="dtTable5">Table数据,可不填</param>
  545. /// <param name="dtTable6">Table数据,可不填</param>
  546. public string ShowReport(DataTable dtTable1, DataTable dtTable2 = null, DataTable dtTable3 = null, DataTable dtTable4 = null, DataTable dtTable5 = null, DataTable dtTable6 = null)
  547. {
  548. AddPrintDataTable(dtTable1);
  549. if (dtTable2 != null)
  550. {
  551. AddPrintDataTable(dtTable2);
  552. }
  553. if (dtTable3 != null)
  554. {
  555. AddPrintDataTable(dtTable3);
  556. }
  557. if (dtTable4 != null)
  558. {
  559. AddPrintDataTable(dtTable4);
  560. }
  561. if (dtTable5 != null)
  562. {
  563. AddPrintDataTable(dtTable5);
  564. }
  565. if (dtTable6 != null)
  566. {
  567. AddPrintDataTable(dtTable6);
  568. }
  569. jPrintValue.Add(new JProperty("Method", "ShowReport"));
  570. return CallPrint();
  571. }
  572. /// <summary>
  573. /// 打印报表,在打印之前先调用了 AddPrintDataIList 或 AddPrintDataTable 增加好了数据集
  574. /// </summary>
  575. public string PrintReport()
  576. {
  577. if (jaryPrintData.Count == 0)
  578. {
  579. throw new Exception("没有数据集");
  580. }
  581. jPrintValue.Add(new JProperty("Method", "PrintReport"));
  582. return CallPrint();
  583. }
  584. /// <summary>
  585. /// 打印报表,1个List数据
  586. /// </summary>
  587. /// <typeparam name="T"></typeparam>
  588. /// <param name="listData"></param>
  589. public string PrintReport<T>(IList<T> listData)
  590. {
  591. AddPrintDataIList<T>(listData);
  592. jPrintValue.Add(new JProperty("Method", "PrintReport"));
  593. return CallPrint();
  594. }
  595. /// <summary>
  596. /// 打印报表:2个List数据
  597. /// </summary>
  598. /// <typeparam name="T"></typeparam>
  599. /// <typeparam name="S"></typeparam>
  600. /// <param name="listData1"></param>
  601. /// <param name="listData2"></param>
  602. public string PrintReport<T, S>(IList<T> listData1, IList<S> listData2)
  603. {
  604. AddPrintDataIList<T>(listData1);
  605. AddPrintDataIList<S>(listData2);
  606. jPrintValue.Add(new JProperty("Method", "PrintReport"));
  607. return CallPrint();
  608. }
  609. /// <summary>
  610. /// 打印报表:多个Table数据
  611. /// </summary>
  612. /// <param name="dtTable1">此Table需要取得数据结构,即在填充数据集之前,先调用:da.FillSchema(ds, SchemaType.Source);</param>
  613. /// <param name="dtTable2">Table数据,可不填</param>
  614. /// <param name="dtTable3">Table数据,可不填</param>
  615. /// <param name="dtTable4">Table数据,可不填</param>
  616. /// <param name="dtTable5">Table数据,可不填</param>
  617. /// <param name="dtTable6">Table数据,可不填</param>
  618. public string PrintReport(DataTable dtTable1, DataTable dtTable2 = null, DataTable dtTable3 = null, DataTable dtTable4 = null, DataTable dtTable5 = null, DataTable dtTable6 = null)
  619. {
  620. AddPrintDataTable(dtTable1);
  621. if (dtTable2 != null)
  622. {
  623. AddPrintDataTable(dtTable2);
  624. }
  625. if (dtTable3 != null)
  626. {
  627. AddPrintDataTable(dtTable3);
  628. }
  629. if (dtTable4 != null)
  630. {
  631. AddPrintDataTable(dtTable4);
  632. }
  633. if (dtTable5 != null)
  634. {
  635. AddPrintDataTable(dtTable5);
  636. }
  637. if (dtTable6 != null)
  638. {
  639. AddPrintDataTable(dtTable6);
  640. }
  641. jPrintValue.Add(new JProperty("Method", "PrintReport"));
  642. return CallPrint();
  643. }
  644. /// <summary>
  645. /// 在线设计报表,在打印之前先调用了 AddPrintDataIList 或 AddPrintDataTable 增加好了数据集
  646. /// </summary>
  647. public string DesignReport()
  648. {
  649. if (jaryPrintData.Count == 0)
  650. {
  651. throw new Exception("没有数据集");
  652. }
  653. jPrintValue.Add(new JProperty("Method", "DesignReport"));
  654. return CallPrint();
  655. }
  656. /// <summary>
  657. /// 在线设计报表,1个List数据
  658. /// </summary>
  659. /// <typeparam name="T"></typeparam>
  660. /// <param name="listData"></param>
  661. public string DesignReport<T>(IList<T> listData)
  662. {
  663. AddPrintDataIList<T>(listData);
  664. jPrintValue.Add(new JProperty("Method", "DesignReport"));
  665. return CallPrint();
  666. }
  667. /// <summary>
  668. /// 在线设计报表:2个List数据
  669. /// </summary>
  670. /// <typeparam name="T"></typeparam>
  671. /// <typeparam name="S"></typeparam>
  672. /// <param name="listData1"></param>
  673. /// <param name="listData2"></param>
  674. public string DesignReport<T, S>(IList<T> listData1, IList<S> listData2)
  675. {
  676. AddPrintDataIList<T>(listData1);
  677. AddPrintDataIList<S>(listData2);
  678. jPrintValue.Add(new JProperty("Method", "DesignReport"));
  679. return CallPrint();
  680. }
  681. /// <summary>
  682. /// 在线设计报表:多个Table数据
  683. /// </summary>
  684. /// <param name="dtTable1">此Table需要取得数据结构,即在填充数据集之前,先调用:da.FillSchema(ds, SchemaType.Source);</param>
  685. /// <param name="dtTable2">Table数据,可不填</param>
  686. /// <param name="dtTable3">Table数据,可不填</param>
  687. /// <param name="dtTable4">Table数据,可不填</param>
  688. /// <param name="dtTable5">Table数据,可不填</param>
  689. /// <param name="dtTable6">Table数据,可不填</param>
  690. public string DesignReport(DataTable dtTable1, DataTable dtTable2 = null, DataTable dtTable3 = null, DataTable dtTable4 = null, DataTable dtTable5 = null, DataTable dtTable6 = null)
  691. {
  692. AddPrintDataTable(dtTable1);
  693. if (dtTable2 != null)
  694. {
  695. AddPrintDataTable(dtTable2);
  696. }
  697. if (dtTable3 != null)
  698. {
  699. AddPrintDataTable(dtTable3);
  700. }
  701. if (dtTable4 != null)
  702. {
  703. AddPrintDataTable(dtTable4);
  704. }
  705. if (dtTable5 != null)
  706. {
  707. AddPrintDataTable(dtTable5);
  708. }
  709. if (dtTable6 != null)
  710. {
  711. AddPrintDataTable(dtTable6);
  712. }
  713. jPrintValue.Add(new JProperty("Method", "DesignReport"));
  714. return CallPrint();
  715. }
  716. /// <summary>
  717. /// 导出报表至Pdf文件,在打印之前先调用了 AddPrintDataIList 或 AddPrintDataTable 增加好了数据集
  718. /// 公司版本才有此功能,个人版本无此功能
  719. /// </summary>
  720. /// <param name="strExportPdfFileName">所导出的Pdf文件的绝对路径及文件名;如果为空,则会弹出打开文件的对话框</param>
  721. public string ExportReportPdf(string strExportPdfFileName = "")
  722. {
  723. if (jaryPrintData.Count == 0)
  724. {
  725. throw new Exception("没有数据集");
  726. }
  727. jPrintValue.Add(new JProperty("ExportPdfFileName", strExportPdfFileName));
  728. jPrintValue.Add(new JProperty("Method", "ExportReportPdf"));
  729. return CallPrint();
  730. }
  731. /// <summary>
  732. /// 导出报表至Pdf文件,1个List数据
  733. /// 公司版本才有此功能,个人版本无此功能
  734. /// </summary>
  735. /// <typeparam name="T"></typeparam>
  736. /// <param name="listData"></param>
  737. /// <param name="strExportPdfFileName">所导出的Pdf文件的绝对路径及文件名;如果为空,则会弹出打开文件的对话框</param>
  738. public string ExportReportPdf<T>(IList<T> listData, string strExportPdfFileName = "")
  739. {
  740. jPrintValue.Add(new JProperty("ExportPdfFileName", strExportPdfFileName));
  741. AddPrintDataIList<T>(listData);
  742. jPrintValue.Add(new JProperty("Method", "ExportReportPdf"));
  743. return CallPrint();
  744. }
  745. /// <summary>
  746. /// 导出报表至Pdf文件:2个List数据
  747. /// 公司版本才有此功能,个人版本无此功能
  748. /// </summary>
  749. /// <typeparam name="T"></typeparam>
  750. /// <typeparam name="S"></typeparam>
  751. /// <param name="listData1"></param>
  752. /// <param name="listData2"></param>
  753. /// <param name="strExportPdfFileName">所导出的Pdf文件的绝对路径及文件名;如果为空,则会弹出打开文件的对话框</param>
  754. public string ExportReportPdf<T, S>(IList<T> listData1, IList<S> listData2, string strExportPdfFileName = "")
  755. {
  756. jPrintValue.Add(new JProperty("ExportPdfFileName", strExportPdfFileName));
  757. AddPrintDataIList<T>(listData1);
  758. AddPrintDataIList<S>(listData2);
  759. jPrintValue.Add(new JProperty("Method", "ExportReportPdf"));
  760. return CallPrint();
  761. }
  762. /// <summary>
  763. /// 导出报表至Pdf文件:多个Table数据
  764. /// 公司版本才有此功能,个人版本无此功能
  765. /// </summary>
  766. /// <param name="dtTable1">此Table需要取得数据结构,即在填充数据集之前,先调用:da.FillSchema(ds, SchemaType.Source);</param>
  767. /// <param name="dtTable2">Table数据,可不填</param>
  768. /// <param name="dtTable3">Table数据,可不填</param>
  769. /// <param name="dtTable4">Table数据,可不填</param>
  770. /// <param name="dtTable5">Table数据,可不填</param>
  771. /// <param name="dtTable6">Table数据,可不填</param>
  772. /// <param name="strExportPdfFileName">所导出的Pdf文件的绝对路径及文件名;如果为空,则会弹出打开文件的对话框</param>
  773. public string ExportReportPdf(DataTable dtTable1, DataTable dtTable2 = null, DataTable dtTable3 = null, DataTable dtTable4 = null, DataTable dtTable5 = null, DataTable dtTable6 = null, string strExportPdfFileName = "")
  774. {
  775. jPrintValue.Add(new JProperty("ExportPdfFileName", strExportPdfFileName));
  776. AddPrintDataTable(dtTable1);
  777. if (dtTable2 != null)
  778. {
  779. AddPrintDataTable(dtTable2);
  780. }
  781. if (dtTable3 != null)
  782. {
  783. AddPrintDataTable(dtTable3);
  784. }
  785. if (dtTable4 != null)
  786. {
  787. AddPrintDataTable(dtTable4);
  788. }
  789. if (dtTable5 != null)
  790. {
  791. AddPrintDataTable(dtTable5);
  792. }
  793. if (dtTable6 != null)
  794. {
  795. AddPrintDataTable(dtTable6);
  796. }
  797. jPrintValue.Add(new JProperty("Method", "ExportReportPdf"));
  798. return CallPrint();
  799. }
  800. /// <summary>
  801. /// 组织好参数,调用控件进行操作
  802. /// </summary>
  803. /// <param name="strReportFileName">报表文件名,包括绝对路径</param>
  804. private string CallPrint()
  805. {
  806. string strPrintFileName = "";
  807. //取报表文件的内容
  808. string strReportFileValue = PrintFunction.FileToString(this.strReportFileName);
  809. jPrintValue.Add(new JProperty("ReportFileValue", strReportFileValue));
  810. //检查注册信息
  811. JObject jRegInfo = new JObject();
  812. jRegInfo.Add(new JProperty("RegName", this.strRegName));
  813. jRegInfo.Add(new JProperty("RegValue", this.strRegValue));
  814. jPrintValue.Add("RegInfo", jRegInfo);
  815. //报表打印的各参数
  816. jPrintValue.Add("PrintParam", jaryPrintParam);
  817. jPrintValue.Add("ButtonHide", jButtonHide);
  818. jPrintValue.Add("Margin", jMargin);
  819. jPrintValue.Add("DataSetName", jDataSetName);
  820. jPrintValue.Add("PictureSingle", jaryPictureSingle);
  821. jPrintValue.Add("PictureTableValue", jaryPictureTableValue);
  822. jPrintValue.Add("PictureTableSet", jaryPictureTableSet);
  823. jPrintValue.Add("PrintData", jaryPrintData);
  824. jPrintValue.Add("CookieUrl", jCookieUrl);
  825. //把JSON内容写入文件,返回文件名
  826. try
  827. {
  828. string strPrintValue = jPrintValue.ToString(Newtonsoft.Json.Formatting.None);
  829. Random r = new Random();
  830. strPrintFileName = "PrintTemp" + DateTime.Now.ToString("yyyyMMddHHmmss") + r.Next(999999) + ".txt";
  831. string strFileName = this.strReportTempDirectory + strPrintFileName;
  832. if (File.Exists(strFileName))
  833. {
  834. File.Delete(strFileName);
  835. }
  836. FileStream pFileStream = new FileStream(strFileName, System.IO.FileMode.CreateNew);
  837. byte[] byteWrite = Encoding.UTF8.GetBytes(strPrintValue);
  838. pFileStream.Write(byteWrite, 0, byteWrite.Length);
  839. byteWrite = null;
  840. pFileStream.Flush();
  841. pFileStream.Close();
  842. pFileStream.Dispose();
  843. }
  844. catch
  845. {
  846. strPrintFileName = "";
  847. }
  848. return strPrintFileName;
  849. }
  850. }
  851. }