开源项目 06 NPOI
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApp2.test1
{
public class Class6
{
public void test1()
{
//DataSet ds = ExcelToDataSet(true, "1.xlsx");
//DataSet ds2 = ExcelToDataSet(false, "1.xlsx"); //Console.WriteLine(ds.Tables.Count);
//Console.WriteLine(ds.Tables[0].Rows.Count); Console.WriteLine(GetExcelColumnName());
} /// <summary>
/// Excel转换为DataSet
/// </summary>
/// <param name="isFirstRowColumn"></param>
/// <param name="fileName"></param>
/// <returns></returns>
public DataSet ExcelToDataSet(bool isFirstRowColumn, string fileName)
{
bool IsSupportFormula = true;//是否支持Excel公式
IWorkbook workbook = null;
DataSet ds = new DataSet();
var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read); #region 初始化Excel if (fileName.IndexOf(".xlsx") > )
{
workbook = new XSSFWorkbook(fs);
}
else if (fileName.IndexOf(".xls") > )
{
workbook = new HSSFWorkbook(fs);
}
else
{
throw new Exception("格式错误!");
}
#endregion for (int sheetIndex = ; sheetIndex < workbook.NumberOfSheets; sheetIndex++)
{
DataTable myTable = new DataTable();
ISheet sheet = null;
int sheetNum = sheetIndex;
sheet = workbook.GetSheetAt(sheetNum); #region 工作表不能为空 if (sheet == null)
{
string str = "";
for (int i = ; i < workbook.NumberOfSheets; i++)
{
str += workbook.GetSheetAt(i).SheetName + ",";
}
str = workbook.NumberOfSheets + str;
throw new Exception($"sheet不能为空!参数:{sheetNum} 工作簿信息:{str}");
}
#endregion #region Excel最大列数 int MaxColumnNum = ;
for (int i = ; i < sheet.LastRowNum; i++)
{
var row = sheet.GetRow(i);
if (row == null)
{
continue;
}
if (row.LastCellNum > MaxColumnNum)
{
MaxColumnNum = row.LastCellNum;
}
}
#endregion //Excel行数
int MaxRowNum = sheet.LastRowNum; #region table新增列 for (int i = ; i < MaxColumnNum; ++i)
{
//首行为列
if (isFirstRowColumn)
{
bool addEmptyCell = true;//是否添加空列
ICell cell = sheet.GetRow().GetCell(i);
if (cell != null)
{
//table列赋值
string cellValue = "";//列名
if (cell.CellType == CellType.Numeric)
{
cellValue = cell.NumericCellValue.ToString();
}
else
{
cellValue = cell.StringCellValue;
}
if (!string.IsNullOrWhiteSpace(cellValue))
{
//列数据为Excel的数据
addEmptyCell = false; if (myTable.Columns.Contains(cellValue))
{
throw new Exception($"已包含列:{cellValue},工作表:{sheet.SheetName}");
}
myTable.Columns.Add(new DataColumn(cellValue));
}
}
if (addEmptyCell)
{
myTable.Columns.Add(new DataColumn(""));//列数据为空
}
}
else
{
myTable.Columns.Add(new DataColumn(i + ""));
}
}
#endregion //起始行
int startRow = ;
if (isFirstRowColumn)
{
startRow = ;
} #region DataTable赋值 for (int i = startRow; i <= MaxRowNum; ++i)
{
IRow row = sheet.GetRow(i);
if (row == null) continue; DataRow NewRow = myTable.NewRow();
for (int j = row.FirstCellNum; j < row.LastCellNum; ++j)
{
ICell cell = row.GetCell(j);
string value = "";
if (cell != null)
{
//table行赋值
if (cell.CellType == CellType.Numeric)
{
value = cell.NumericCellValue.ToString();
//if ((j == 0) && ((i == 6) || (i == 12)))
//{
// //特殊的几个单元格 转换为 日期格式
// value = ToDateTimeValue(cell.NumericCellValue.ToString());
//} }
else if (cell.CellType == CellType.Formula)
{
if (IsSupportFormula)
{
try
{
#region 公式计算 if (fileName.IndexOf(".xlsx") > )
{
XSSFFormulaEvaluator e = new XSSFFormulaEvaluator(cell.Sheet.Workbook);
e.EvaluateInCell(cell);
value = cell.ToString();
}
else if (fileName.IndexOf(".xls") > )
{
HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(cell.Sheet.Workbook);
e.EvaluateInCell(cell);
value = cell.ToString();
}
#endregion
}
catch
{
//日期
if (DateUtil.IsCellDateFormatted(cell))
{
value = cell.DateCellValue.ToString("yyyy-MM-dd");
}
else
{
value = cell.NumericCellValue.ToString();
}
}
}
else
{
throw new Exception($"Excel含有公式 fileName:{fileName} sheetIndex:{sheetIndex + 1} rowIndex:{i + 1} colIndex:{j + 1}\r\n");
} }
else
{
//row.GetCell(j).SetCellType(CellType.String);
value = cell.StringCellValue;
}
}
NewRow[j] = value;
}
myTable.Rows.Add(NewRow);
}
#endregion ds.Tables.Add(myTable);
}
return ds;
} /// <summary>
/// 数字格式的时间 转换为 字符串格式的时间
/// 数字格式的时间 如: 42095.7069444444/0.650694444444444
/// </summary>
/// <param name="timeStr">数字,如:42095.7069444444/0.650694444444444</param>
/// <returns>日期/时间格式</returns>
public string ToDateTimeValue(string strNumber)
{
if (!string.IsNullOrWhiteSpace(strNumber))
{
Decimal tempValue;
//先检查 是不是数字;
if (Decimal.TryParse(strNumber, out tempValue))
{
//天数,取整
int day = Convert.ToInt32(Math.Truncate(tempValue));
//这里也不知道为什么. 如果是小于32,则减1,否则减2
//日期从1900-01-01开始累加
// day = day < 32 ? day - 1 : day - 2;
DateTime dt = new DateTime(, , ).AddDays(day < ? (day - ) : (day - )); //小时:减掉天数,这个数字转换小时:(* 24)
Decimal hourTemp = (tempValue - day) * ;//获取小时数
//取整.小时数
int hour = Convert.ToInt32(Math.Truncate(hourTemp));
//分钟:减掉小时,( * 60)
//这里舍入,否则取值会有1分钟误差.
Decimal minuteTemp = Math.Round((hourTemp - hour) * , );//获取分钟数
int minute = Convert.ToInt32(Math.Truncate(minuteTemp));
//秒:减掉分钟,( * 60)
//这里舍入,否则取值会有1秒误差.
Decimal secondTemp = Math.Round((minuteTemp - minute) * , );//获取秒数
int second = Convert.ToInt32(Math.Truncate(secondTemp)); //时间格式:00:00:00
string resultTimes = string.Format("{0}:{1}:{2}",
(hour < ? ("" + hour) : hour.ToString()),
(minute < ? ("" + minute) : minute.ToString()),
(second < ? ("" + second) : second.ToString())); if (day > )
return string.Format("{0} {1}", dt.ToString("yyyy-MM-dd"), resultTimes);
else
return resultTimes;
}
}
return string.Empty;
} /// <summary>
/// 获取Excel的列名
/// 这个还是有很多bug 先将就用吧
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public string GetExcelColumnName(int index)
{
var arr = new List<string>() { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
string name = ""; if (index <= arr.Count)
{
for (int i = ; i < arr.Count; i++)
{
if ((i + ) == index)
{
name = arr[i];
}
}
}
else
{
int num = ; num = index / arr.Count;
for (int i = ; i < num; i++)
{
name += "A";
} num = index % arr.Count;
name += arr[num - ];
} if ((name.Length >= ))
{
//&& (name.Length - 2 <= arr.Count - 1)
name = arr[name.Length - ] + name.Substring(name.Length - , );
}
return name;
} /// <summary>
/// DataTable 转换为 Html,点击单元格 输出 单元格所在的 行和列
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public string GetHtmlString(DataTable dt)
{
StringBuilder sb = new StringBuilder();
sb.Append("<html><head>");
sb.Append("<title>Excel转换为Table</title>");
sb.Append("<meta http-equiv='content-type' content='text/html; charset=GB2312'> ");
sb.Append("<style type=text/css>");
sb.Append("td{font-size: 9pt;border:solid 1 #000000;}");
sb.Append("table{padding:3 0 3 0;border:solid 1 #000000;margin:0 0 0 0;BORDER-COLLAPSE: collapse;}");
sb.Append("</style>");
sb.Append("</head>");
sb.Append("<body>");
sb.Append("<table cellSpacing='0' cellPadding='0' width ='100%' border='1'>");
sb.Append("<tr valign='middle'>");
sb.Append("<td><b></b></td>");
foreach (DataColumn column in dt.Columns)
{
sb.Append("<td><b><span>" + column.ColumnName + "</span></b></td>");
}
sb.Append("</tr>");
int iColsCount = dt.Columns.Count;
int rowsCount = dt.Rows.Count - ;
for (int j = ; j <= rowsCount; j++)
{
sb.Append("<tr>");
sb.Append("<td>" + ((int)(j + )).ToString() + "</td>");
for (int k = ; k <= iColsCount - ; k++)
{
sb.Append("<td>");
object obj = dt.Rows[j][k];
if (obj == DBNull.Value)
{
obj = " ";//如果是NULL则在HTML里面使用一个空格替换之
}
if (obj.ToString() == "")
{
obj = " ";
}
string strCellContent = obj.ToString().Trim();
sb.Append("<span>" + strCellContent + "</span>");
sb.Append("</td>");
}
sb.Append("</tr>");
}
sb.Append("</table>"); //点击单元格 输出 行和列
sb.Append("<script src='https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js'></script>");
sb.Append("<script type='text/javascript'>");
sb.Append("$('table tbody').on('click', 'td', function (e) {");
sb.Append("var row = $(this).parent().prevAll().length-1 ;");
sb.Append("var column = $(this).prevAll().length-1 ;");
sb.Append("var str = 'dt.Rows[' + row + '][' + column + '].ToString()';");
sb.Append("console.log(str);alert(str);");
sb.Append("});");
sb.Append("</script>"); sb.Append("</body></html>");
return sb.ToString();
} }
}
开源项目 06 NPOI的更多相关文章
- 【目录】本博客其他.NET开源项目文章目录
本博客所有文章分类的总目录链接:本博客博文总目录-实时更新 1.本博客其他.NET开源项目文章目录 37..NET平台开源项目速览(17)FluentConsole让你的控制台酷起来 36..NET平 ...
- C#.NET开源项目、机器学习、商务智能
所以原谅我,不能把所有的都发上来,太杂了,反而不好. 1..NET时间周期处理组件 这个组件很小,主要是对时间日期,特别是处理时间间隔以及时间范围非常方便.虽然.NET自带了时间日期的部分功能,但可能 ...
- C#.NET开源项目、机器学习、Power BI
[总目录]本博客博文总目录-实时更新 阅读目录 1.开源Math.NET基础数学类库使用系列 2.C#操作Excel组件Spire.XLS文章目录 3.彩票数据资料库文章 4.数据挖掘与机器学习相 ...
- 这些.NET开源项目你知道吗?.NET平台开源文档与报表处理组件集合(三)
在前2篇文章这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧 和这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,大伙热情高涨.再次拿出自己的私货,在.NET平台 ...
- 收集常用的.net开源项目
Json.NET http://json.codeplex.com/ Json.NET是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单.通过Lin ...
- [转] Android优秀开源项目
Android经典的开源项目其实非常多,但是国内的博客总是拿着N年前的一篇复制来复制去,实在是不利于新手学习.今天爬爬把自己熟悉的一些开源项目整理起来,希望能对Android开发同学们有所帮助.另外, ...
- .Net 开源项目资源大全
伯乐在线已在 GitHub 上发起「DotNet 资源大全中文版」的整理.欢迎扩散.欢迎加入. https://github.com/jobbole/awesome-dotnet-cn (注:下面用 ...
- Github上关于iOS的各种开源项目集合(强烈建议大家收藏,查看,总有一款你需要)
下拉刷新 EGOTableViewPullRefresh - 最早的下拉刷新控件. SVPullToRefresh - 下拉刷新控件. MJRefresh - 仅需一行代码就可以为UITableVie ...
- Android开源项目分类汇总
目前包括: Android开源项目第一篇——个性化控件(View)篇 包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView. ...
随机推荐
- GreenPlum 最佳实践
数据模型 Greenplum数据库是一种shared nothing的分析型MPP数据库.这种模型与高度规范化的/事务型的SMP数据库有显著区别.Greenplum数据库使用非规范化的模式设计会工作得 ...
- Spring Boot Freemarker特别篇之contextPath【从零开始学Spring Boot
需求缘起:有人在群里@我:请教群主大神一个问题,spring boot + freemarker 怎么获取contextPath 头疼死我了,网上没一个靠谱的 .我就看看之前博客中的 [Spri ...
- HUAWEI,H3C 三层交换机 常用命令
<HUAWEI> display ip interface brief,命令全局模式下可以查看所有端口下的ip地址及物理状态display this interface,命令用来显示当前接 ...
- java之spring之scope和autowiring
目录结构如下: UserDao.java package cn.sxt.dao; public interface UserDao { public void add(); } UserDaoImpl ...
- C# vb .net图像合成-多图片叠加合成
在.net中,如何简单快捷地实现图像合成呢,比如合成文字,合成艺术字,多张图片叠加合成等等?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码 ...
- 安卓自定义View基础 --坐标系,角度弧度,颜色
转自:https://www.gcssloop.com/customview/CustomViewIndex/ 1.坐标系 2.角度弧度 3.颜色 一.屏幕坐标系和数学坐标系的区别 由于移动设备一般定 ...
- JDBC简单增删改查实现(单表)
0.准备工作 开发工具: MySQL数据库, intelliJ IDEA2017. 准备jar包: mysql-connector-java-5.1.28-bin.jar(其他均可) 1. 数据库数据 ...
- 学习笔记之Slurm
Slurm Workload Manager - Overview https://slurm.schedmd.com/overview.html Slurm is an open source, f ...
- Koa2 和 Express 中间件对比
koa2 中间件 koa2的中间件是通过 async await 实现的,中间件执行顺序是"洋葱圈"模型. 中间件之间通过next函数联系,当一个中间件调用 next() 后,会将 ...
- ECharts快速入门
一.简介 ECharts,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Saf ...