由于XSSFWorkbook类型的Write方法限制,Write完成后就自动关闭流数据,所以无法很好的支持的Web模式,网上目前也未找到好的解决方案。

注意:若直接使用在WinForm项目中,必需先下载并在项目中引用NPOI2.0或以上版本的组件才可以正常使用。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO;
  6. using System.Data;
  7. using System.Windows.Forms;
  8. using NPOI.SS.UserModel;
  9. using NPOI.HSSF.UserModel;
  10. using NPOI.XSSF.UserModel;
  11. using Zwj.TEMS.Common;
  12.  
  13. namespace TEMS.Service
  14. {
  15. public static class ExcelHelperForCs
  16. {
  17. #region 私有方法
  18.  
  19. /// <summary>
  20. /// 获取要保存的文件名称(含完整路径)
  21. /// </summary>
  22. /// <returns></returns>
  23. private static string GetSaveFilePath()
  24. {
  25. SaveFileDialog saveFileDig = new SaveFileDialog();
  26. saveFileDig.Filter = "Excel Office97-2003(*.xls)|.xls|Excel Office2007及以上(*.xlsx)|*.xlsx";
  27. saveFileDig.FilterIndex = ;
  28. saveFileDig.OverwritePrompt = true;
  29. saveFileDig.InitialDirectory = Common.DesktopDirectory;
  30. string filePath = null;
  31. if (saveFileDig.ShowDialog() == DialogResult.OK)
  32. {
  33. filePath = saveFileDig.FileName;
  34. }
  35.  
  36. return filePath;
  37. }
  38.  
  39. /// <summary>
  40. /// 判断是否为兼容模式
  41. /// </summary>
  42. /// <param name="filePath"></param>
  43. /// <returns></returns>
  44. private static bool GetIsCompatible(string filePath)
  45. {
  46. return filePath.EndsWith(".xls", StringComparison.OrdinalIgnoreCase);
  47. }
  48.  
  49. /// <summary>
  50. /// 创建工作薄
  51. /// </summary>
  52. /// <param name="isCompatible"></param>
  53. /// <returns></returns>
  54. private static IWorkbook CreateWorkbook(bool isCompatible)
  55. {
  56. if (isCompatible)
  57. {
  58. return new HSSFWorkbook();
  59. }
  60. else
  61. {
  62. return new XSSFWorkbook();
  63. }
  64. }
  65.  
  66. /// <summary>
  67. /// 创建工作薄(依据文件流)
  68. /// </summary>
  69. /// <param name="isCompatible"></param>
  70. /// <param name="stream"></param>
  71. /// <returns></returns>
  72. private static IWorkbook CreateWorkbook(bool isCompatible, dynamic stream)
  73. {
  74. if (isCompatible)
  75. {
  76. return new HSSFWorkbook(stream);
  77. }
  78. else
  79. {
  80. return new XSSFWorkbook(stream);
  81. }
  82. }
  83.  
  84. /// <summary>
  85. /// 创建表格头单元格
  86. /// </summary>
  87. /// <param name="sheet"></param>
  88. /// <returns></returns>
  89. private static ICellStyle GetCellStyle(IWorkbook workbook)
  90. {
  91. ICellStyle style = workbook.CreateCellStyle();
  92. style.FillPattern = FillPattern.SolidForeground;
  93. style.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Grey25Percent.Index;
  94.  
  95. return style;
  96. }
  97.  
  98. /// <summary>
  99. /// 从工作表中生成DataTable
  100. /// </summary>
  101. /// <param name="sheet"></param>
  102. /// <param name="headerRowIndex"></param>
  103. /// <returns></returns>
  104. private static DataTable GetDataTableFromSheet(ISheet sheet, int headerRowIndex)
  105. {
  106. DataTable table = new DataTable();
  107.  
  108. IRow headerRow = sheet.GetRow(headerRowIndex);
  109. int cellCount = headerRow.LastCellNum;
  110.  
  111. for (int i = headerRow.FirstCellNum; i < cellCount; i++)
  112. {
  113. if (headerRow.GetCell(i) == null || headerRow.GetCell(i).StringCellValue.Trim() == "")
  114. {
  115. // 如果遇到第一个空列,则不再继续向后读取
  116. cellCount = i + ;
  117. break;
  118. }
  119. DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
  120. table.Columns.Add(column);
  121. }
  122.  
  123. for (int i = (headerRowIndex + ); i <= sheet.LastRowNum; i++)
  124. {
  125. IRow row = sheet.GetRow(i);
  126.  
  127. if (row != null && !string.IsNullOrEmpty(row.Cells[].StringCellValue))
  128. {
  129. DataRow dataRow = table.NewRow();
  130.  
  131. for (int j = row.FirstCellNum; j < cellCount; j++)
  132. {
  133. if (row.GetCell(j) != null)
  134. {
  135. dataRow[j] = row.GetCell(j).ToString();
  136. }
  137. }
  138.  
  139. table.Rows.Add(dataRow);
  140. }
  141. }
  142.  
  143. return table;
  144. }
  145.  
  146. #endregion
  147.  
  148. #region 公共导出方法
  149.  
  150. /// <summary>
  151. /// 由DataSet导出Excel
  152. /// </summary>
  153. /// <param name="sourceTable">要导出数据的DataTable</param>
  154. /// <returns>Excel工作表</returns>
  155. public static string ExportToExcel(DataSet sourceDs, string filePath = null)
  156. {
  157.  
  158. if (string.IsNullOrEmpty(filePath))
  159. {
  160. filePath = GetSaveFilePath();
  161. }
  162.  
  163. if (string.IsNullOrEmpty(filePath)) return null;
  164.  
  165. bool isCompatible = GetIsCompatible(filePath);
  166.  
  167. IWorkbook workbook = CreateWorkbook(isCompatible);
  168. ICellStyle cellStyle = GetCellStyle(workbook);
  169.  
  170. for (int i = ; i < sourceDs.Tables.Count; i++)
  171. {
  172. DataTable table = sourceDs.Tables[i];
  173. string sheetName = "result" + i.ToString();
  174. ISheet sheet = workbook.CreateSheet(sheetName);
  175. IRow headerRow = sheet.CreateRow();
  176. // handling header.
  177. foreach (DataColumn column in table.Columns)
  178. {
  179. ICell cell = headerRow.CreateCell(column.Ordinal);
  180. cell.SetCellValue(column.ColumnName);
  181. cell.CellStyle = cellStyle;
  182. }
  183.  
  184. // handling value.
  185. int rowIndex = ;
  186.  
  187. foreach (DataRow row in table.Rows)
  188. {
  189. IRow dataRow = sheet.CreateRow(rowIndex);
  190.  
  191. foreach (DataColumn column in table.Columns)
  192. {
  193. dataRow.CreateCell(column.Ordinal).SetCellValue((row[column] ?? "").ToString());
  194. }
  195.  
  196. rowIndex++;
  197. }
  198. }
  199.  
  200. FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
  201. workbook.Write(fs);
  202. fs.Dispose();
  203. workbook = null;
  204.  
  205. return filePath;
  206.  
  207. }
  208.  
  209. /// <summary>
  210. /// 由DataTable导出Excel
  211. /// </summary>
  212. /// <param name="sourceTable">要导出数据的DataTable</param>
  213. /// <returns>Excel工作表</returns>
  214. public static string ExportToExcel(DataTable sourceTable, string sheetName = "result", string filePath = null)
  215. {
  216. if (sourceTable.Rows.Count <= ) return null;
  217.  
  218. if (string.IsNullOrEmpty(filePath))
  219. {
  220. filePath = GetSaveFilePath();
  221. }
  222.  
  223. if (string.IsNullOrEmpty(filePath)) return null;
  224.  
  225. bool isCompatible = GetIsCompatible(filePath);
  226.  
  227. IWorkbook workbook = CreateWorkbook(isCompatible);
  228. ICellStyle cellStyle = GetCellStyle(workbook);
  229.  
  230. ISheet sheet = workbook.CreateSheet(sheetName);
  231. IRow headerRow = sheet.CreateRow();
  232. // handling header.
  233. foreach (DataColumn column in sourceTable.Columns)
  234. {
  235. ICell headerCell = headerRow.CreateCell(column.Ordinal);
  236. headerCell.SetCellValue(column.ColumnName);
  237. headerCell.CellStyle = cellStyle;
  238. }
  239.  
  240. // handling value.
  241. int rowIndex = ;
  242.  
  243. foreach (DataRow row in sourceTable.Rows)
  244. {
  245. IRow dataRow = sheet.CreateRow(rowIndex);
  246.  
  247. foreach (DataColumn column in sourceTable.Columns)
  248. {
  249. dataRow.CreateCell(column.Ordinal).SetCellValue((row[column]??"").ToString());
  250. }
  251.  
  252. rowIndex++;
  253. }
  254. FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
  255. workbook.Write(fs);
  256. fs.Dispose();
  257.  
  258. sheet = null;
  259. headerRow = null;
  260. workbook = null;
  261.  
  262. return filePath;
  263. }
  264.  
  265. /// <summary>
  266. /// 由List导出Excel
  267. /// </summary>
  268. /// <typeparam name="T">类型</typeparam>
  269. /// <param name="data">在导出的List</param>
  270. /// <param name="sheetName">sheet名称</param>
  271. /// <returns></returns>
  272. public static string ExportToExcel<T>(List<T> data, IList<KeyValuePair<string, string>> headerNameList, string sheetName = "result", string filePath = null) where T : class
  273. {
  274. if (data.Count <= ) return null;
  275.  
  276. if (string.IsNullOrEmpty(filePath))
  277. {
  278. filePath = GetSaveFilePath();
  279. }
  280.  
  281. if (string.IsNullOrEmpty(filePath)) return null;
  282.  
  283. bool isCompatible = GetIsCompatible(filePath);
  284.  
  285. IWorkbook workbook = CreateWorkbook(isCompatible);
  286. ICellStyle cellStyle = GetCellStyle(workbook);
  287. ISheet sheet = workbook.CreateSheet(sheetName);
  288. IRow headerRow = sheet.CreateRow();
  289.  
  290. for (int i = ; i < headerNameList.Count; i++)
  291. {
  292. ICell cell = headerRow.CreateCell(i);
  293. cell.SetCellValue(headerNameList[i].Value);
  294. cell.CellStyle = cellStyle;
  295. }
  296.  
  297. Type t = typeof(T);
  298. int rowIndex = ;
  299. foreach (T item in data)
  300. {
  301. IRow dataRow = sheet.CreateRow(rowIndex);
  302. for (int n = ; n < headerNameList.Count; n++)
  303. {
  304. object pValue = t.GetProperty(headerNameList[n].Key).GetValue(item, null);
  305. dataRow.CreateCell(n).SetCellValue((pValue ?? "").ToString());
  306. }
  307. rowIndex++;
  308. }
  309. FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
  310. workbook.Write(fs);
  311. fs.Dispose();
  312.  
  313. sheet = null;
  314. headerRow = null;
  315. workbook = null;
  316.  
  317. return filePath;
  318. }
  319.  
  320. /// <summary>
  321. /// 由DataGridView导出
  322. /// </summary>
  323. /// <param name="grid"></param>
  324. /// <param name="sheetName"></param>
  325. /// <param name="filePath"></param>
  326. /// <returns></returns>
  327. public static string ExportToExcel(DataGridView grid, string sheetName = "result", string filePath = null)
  328. {
  329. if (grid.Rows.Count <= ) return null;
  330.  
  331. if (string.IsNullOrEmpty(filePath))
  332. {
  333. filePath = GetSaveFilePath();
  334. }
  335.  
  336. if (string.IsNullOrEmpty(filePath)) return null;
  337.  
  338. bool isCompatible = GetIsCompatible(filePath);
  339.  
  340. IWorkbook workbook = CreateWorkbook(isCompatible);
  341. ICellStyle cellStyle = GetCellStyle(workbook);
  342. ISheet sheet = workbook.CreateSheet(sheetName);
  343.  
  344. IRow headerRow = sheet.CreateRow();
  345.  
  346. for (int i = ; i < grid.Columns.Count; i++)
  347. {
  348. ICell cell = headerRow.CreateCell(i);
  349. cell.SetCellValue(grid.Columns[i].Name);
  350. cell.CellStyle = cellStyle;
  351. }
  352.  
  353. int rowIndex = ;
  354. foreach (DataGridViewRow row in grid.Rows)
  355. {
  356. IRow dataRow = sheet.CreateRow(rowIndex);
  357. for (int n = ; n < grid.Columns.Count; n++)
  358. {
  359. dataRow.CreateCell(n).SetCellValue((row.Cells[n].Value ?? "").ToString());
  360. }
  361. rowIndex++;
  362. }
  363.  
  364. FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
  365. workbook.Write(fs);
  366. fs.Dispose();
  367.  
  368. sheet = null;
  369. headerRow = null;
  370. workbook = null;
  371.  
  372. return filePath;
  373. }
  374.  
  375. #endregion
  376.  
  377. #region 公共导入方法
  378.  
  379. /// <summary>
  380. /// 由Excel导入DataTable
  381. /// </summary>
  382. /// <param name="excelFileStream">Excel文件流</param>
  383. /// <param name="sheetName">Excel工作表名称</param>
  384. /// <param name="headerRowIndex">Excel表头行索引</param>
  385. /// <param name="isCompatible">是否为兼容模式</param>
  386. /// <returns>DataTable</returns>
  387. public static DataTable ImportFromExcel(Stream excelFileStream, string sheetName, int headerRowIndex, bool isCompatible)
  388. {
  389. IWorkbook workbook = CreateWorkbook(isCompatible, excelFileStream);
  390. ISheet sheet = null;
  391. int sheetIndex = -;
  392. if (int.TryParse(sheetName, out sheetIndex))
  393. {
  394. sheet = workbook.GetSheetAt(sheetIndex);
  395. }
  396. else
  397. {
  398. sheet = workbook.GetSheet(sheetName);
  399. }
  400.  
  401. DataTable table = GetDataTableFromSheet(sheet, headerRowIndex);
  402.  
  403. excelFileStream.Close();
  404. workbook = null;
  405. sheet = null;
  406. return table;
  407. }
  408.  
  409. /// <summary>
  410. /// 由Excel导入DataTable
  411. /// </summary>
  412. /// <param name="excelFilePath">Excel文件路径,为物理路径。</param>
  413. /// <param name="sheetName">Excel工作表名称</param>
  414. /// <param name="headerRowIndex">Excel表头行索引</param>
  415. /// <returns>DataTable</returns>
  416. public static DataTable ImportFromExcel(string excelFilePath, string sheetName, int headerRowIndex)
  417. {
  418. using (FileStream stream = System.IO.File.OpenRead(excelFilePath))
  419. {
  420. bool isCompatible = GetIsCompatible(excelFilePath);
  421. return ImportFromExcel(stream, sheetName, headerRowIndex, isCompatible);
  422. }
  423. }
  424.  
  425. /// <summary>
  426. /// 由Excel导入DataSet,如果有多个工作表,则导入多个DataTable
  427. /// </summary>
  428. /// <param name="excelFileStream">Excel文件流</param>
  429. /// <param name="headerRowIndex">Excel表头行索引</param>
  430. /// <param name="isCompatible">是否为兼容模式</param>
  431. /// <returns>DataSet</returns>
  432. public static DataSet ImportFromExcel(Stream excelFileStream, int headerRowIndex, bool isCompatible)
  433. {
  434. DataSet ds = new DataSet();
  435. IWorkbook workbook = CreateWorkbook(isCompatible, excelFileStream);
  436. for (int i = ; i < workbook.NumberOfSheets; i++)
  437. {
  438. ISheet sheet = workbook.GetSheetAt(i);
  439. DataTable table = GetDataTableFromSheet(sheet, headerRowIndex);
  440. ds.Tables.Add(table);
  441. }
  442.  
  443. excelFileStream.Close();
  444. workbook = null;
  445.  
  446. return ds;
  447. }
  448.  
  449. /// <summary>
  450. /// 由Excel导入DataSet,如果有多个工作表,则导入多个DataTable
  451. /// </summary>
  452. /// <param name="excelFilePath">Excel文件路径,为物理路径。</param>
  453. /// <param name="headerRowIndex">Excel表头行索引</param>
  454. /// <returns>DataSet</returns>
  455. public static DataSet ImportFromExcel(string excelFilePath, int headerRowIndex)
  456. {
  457. using (FileStream stream = System.IO.File.OpenRead(excelFilePath))
  458. {
  459. bool isCompatible = GetIsCompatible(excelFilePath);
  460. return ImportFromExcel(stream, headerRowIndex, isCompatible);
  461. }
  462. }
  463.  
  464. #endregion
  465.  
  466. #region 公共转换方法
  467.  
  468. /// <summary>
  469. /// 将Excel的列索引转换为列名,列索引从0开始,列名从A开始。如第0列为A,第1列为B...
  470. /// </summary>
  471. /// <param name="index">列索引</param>
  472. /// <returns>列名,如第0列为A,第1列为B...</returns>
  473. public static string ConvertColumnIndexToColumnName(int index)
  474. {
  475. index = index + ;
  476. int system = ;
  477. char[] digArray = new char[];
  478. int i = ;
  479. while (index > )
  480. {
  481. int mod = index % system;
  482. if (mod == ) mod = system;
  483. digArray[i++] = (char)(mod - + 'A');
  484. index = (index - ) / ;
  485. }
  486. StringBuilder sb = new StringBuilder(i);
  487. for (int j = i - ; j >= ; j--)
  488. {
  489. sb.Append(digArray[j]);
  490. }
  491. return sb.ToString();
  492. }
  493.  
  494. /// <summary>
  495. /// 转化日期
  496. /// </summary>
  497. /// <param name="date">日期</param>
  498. /// <returns></returns>
  499. public static DateTime ConvertDate(object date)
  500. {
  501. string dtStr = (date ?? "").ToString();
  502.  
  503. DateTime dt = new DateTime();
  504.  
  505. if (DateTime.TryParse(dtStr, out dt))
  506. {
  507. return dt;
  508. }
  509.  
  510. try
  511. {
  512. string spStr = "";
  513. if (dtStr.Contains("-"))
  514. {
  515. spStr = "-";
  516. }
  517. else if (dtStr.Contains("/"))
  518. {
  519. spStr = "/";
  520. }
  521. string[] time = dtStr.Split(spStr.ToCharArray());
  522. int year = Convert.ToInt32(time[]);
  523. int month = Convert.ToInt32(time[]);
  524. int day = Convert.ToInt32(time[]);
  525. string years = Convert.ToString(year);
  526. string months = Convert.ToString(month);
  527. string days = Convert.ToString(day);
  528. if (months.Length == )
  529. {
  530. dt = Convert.ToDateTime(date);
  531. }
  532. else
  533. {
  534. string rq = "";
  535. if (years.Length == )
  536. {
  537. years = "" + years;
  538. }
  539. if (months.Length == )
  540. {
  541. months = "" + months;
  542. }
  543. if (days.Length == )
  544. {
  545. days = "" + days;
  546. }
  547. rq = "" + years + "-" + months + "-" + days;
  548. dt = Convert.ToDateTime(rq);
  549. }
  550. }
  551. catch
  552. {
  553. throw new Exception("日期格式不正确,转换日期失败!");
  554. }
  555. return dt;
  556. }
  557.  
  558. /// <summary>
  559. /// 转化数字
  560. /// </summary>
  561. /// <param name="d">数字字符串</param>
  562. /// <returns></returns>
  563. public static decimal ConvertDecimal(object d)
  564. {
  565. string dStr = (d ?? "").ToString();
  566. decimal result = ;
  567. if (decimal.TryParse(dStr, out result))
  568. {
  569. return result;
  570. }
  571. else
  572. {
  573. throw new Exception("数字格式不正确,转换数字失败!");
  574. }
  575.  
  576. }
  577.  
  578. #endregion
  579. }
  580. }

原文:https://www.cnblogs.com/jimcsharp/p/6634530.html

NPOI导入导出EXCEL通用类,可直接使用在WinForm项目中的更多相关文章

  1. NPOI导入导出EXCEL通用类,供参考,可直接使用在WinForm项目中

    以下是NPOI导入导出EXCEL通用类,是在别人的代码上进行优化的,兼容xls与xlsx文件格式,供参考,可直接使用在WinForm项目中,由于XSSFWorkbook类型的Write方法限制,Wri ...

  2. MVC NPOI Linq导出Excel通用类

    之前写了一个模型导出Excel通用类,但是在实际应用中,可能不是直接导出模型,而是通过Linq查询后获取到最终结果再导出 通用类: public enum DataTypeEnum { Int = , ...

  3. NPOI导入导出Excel工具类

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Ref ...

  4. NPOI导入导出Excel

    .net mvc利用NPOI导入导出excel 注意:如何导出的提交方式ajax导出是失效的! 解决方案是:js处理l两个表单的提交  代码:  第一步. 在页面里面加入2个隐藏的iframe, 如下 ...

  5. .Net core NPOI导入导出Excel

    最近在想.net core NPOI 导入导出Excel,一开始感觉挺简单的,后来真的遇到很多坑.所以还是写一篇博客让其他人少走一些弯路,也方便忘记了再重温一遍.好了,多的不说,直接开始吧. 在.Ne ...

  6. 导入导出Excel工具类ExcelUtil

    前言 前段时间做的分布式集成平台项目中,许多模块都用到了导入导出Excel的功能,于是决定封装一个ExcelUtil类,专门用来处理Excel的导入和导出 本项目的持久化层用的是JPA(底层用hibe ...

  7. NPOI MVC 模型导出Excel通用类

    通用类: public enum DataTypeEnum { Int = , Float = , Double = , String = , DateTime = , Date = } public ...

  8. Npoi导入导出Excel操作

    之前公司的一个物流商系统需要实现对订单的批量导入和导出,翻阅了一些资料,最后考虑使用NPOI实现这个需求. 在winform上面实现excel操作:http://www.cnblogs.com/Cal ...

  9. NPOI 导入导出excel 支持 03 07

    因为微软的office成本太高了,所以开发项目的时候电脑上没安装office,而是安装了wps.但开发语言用的是C#,所以直接调用微软的office组件是很方便的,但一方面慢,一方面成本高,所以从网上 ...

随机推荐

  1. 20165215 学习基础和c语言基础调查

    学习基础和c语言基础调查 <做中学>读后感与技能学习心得 读后感 Don't watch the clock. Do what it does. Keep going. 不要只看时钟,要效 ...

  2. Linux基础命令---修改用户信息usermod

    usermod 修改用户的信息,包括用户名.密码.家目录.uid等. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. 1.语法 use ...

  3. qq网吧弹框如何去掉?如何删掉NetBar文件夹?

    qq网吧弹框如何去掉?如何删掉NetBar文件夹?有些qq会弹出qq网吧,让人烦恼.而且点了那个不是网吧的反馈了多次都还会弹出.如何退出关闭删除取消去掉qq网吧呢,下面介绍一种解决方法:1.打开qq安 ...

  4. SharePoint入门——创建一个网站

    1.首先安装SP相关环境,可以百度到具体操作步骤: (以下步骤基于本人环境:本人用的Win10自带的Hyper-V虚拟机.Windows Server2012R2.SQL2014以及SharePoin ...

  5. ES6知识整理(5)--对象的扩展

    个人开这个公众号的初心是为了积累知识,因此并没有做什么推广,再说自己也不知道怎么推广,推广之后又能干些什么.已经将近10天没发文章了,虽然每天都加班,但也不会一点时间都没有,有时还是会懒癌发作不想学习 ...

  6. SRTP参数及数据包处理过程(转)

    源: SRTP参数及数据包处理过程

  7. Docker学习笔记之在开发环境中使用服务发现

    0x00 概述 服务发现应用是很多服务化系统的组成部分,所以在开发.测试环境中也就有必要配备一套服务发现体系来配合我们的开发.测试工作.在这一小节里,我们就来谈谈如何在 Docker 环境下部署服务发 ...

  8. metasploit(MSF)对windows的ms17-010漏洞利用

    picture 配置exploit msf > use exploit/windows/smb/ms17_010_eternalblue msf exploit(windows/smb/ms17 ...

  9. day24,25组合 封装 多态

    面向对象的精髓:将数据和处理数据的代码绑定成一个对象 只要获取到对象相应的数据和方法都有了 一.组合 什么叫组合? 多个对象放在一起叫组合 组合的作用也是降低代码的冗余 # 学生会增加各种各样的新的属 ...

  10. topcoder srm 495 div1

    problem1 link 从前向后确定一下,然后再从后向前确定一下.一样的话就是可以确定的. problem2 link 首先将强连通分量缩点.理论上来说,只需要遍历所有入度为0的联通块中的一个即可 ...