C# Excel转换为Json
demo:https://files.cnblogs.com/files/guxingy/Excel%E8%BD%AC%E6%8D%A2%E4%B8%BAJson%E5%AF%B9%E8%B1%A1.rar
不太会用博客
待转换的Excel格式
转换后的JSON格式:
Excel转换类:
public class OperationExcel
{
/// <summary>
/// Excel 转换为 Datatable
/// </summary>
/// <param name="sheetNum">工作表索引</param>
/// <param name="isFirstRowColumn">首行为列</param>
/// <param name="fileName">Excel文件路径</param>
/// <returns></returns>
public DataTable ExcelToDataTable(int sheetNum, bool isFirstRowColumn, string fileName)
{
IWorkbook workbook = null;
ISheet sheet = null;
DataTable myTable = new DataTable();
try
{
var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
if (fileName.IndexOf(".xlsx") > )
workbook = new XSSFWorkbook(fs);
else if (fileName.IndexOf(".xls") > )
workbook = new HSSFWorkbook(fs);
sheet = workbook.GetSheetAt(sheetNum); //工作表不能为空
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}");
} //Excel最大列数
int MaxColumnNum = ;
for (int i = ; i < sheet.LastRowNum; i++)
{
var row = sheet.GetRow(i);
if (row.LastCellNum > MaxColumnNum)
{
MaxColumnNum = row.LastCellNum;
}
}
//Excel行数
int MaxRowNum = sheet.LastRowNum; //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;
myTable.Columns.Add(new DataColumn(cellValue));
}
}
if (addEmptyCell)
{
myTable.Columns.Add(new DataColumn(""));//列数据为空
}
}
else
{
myTable.Columns.Add(new DataColumn(i + ""));
}
} //起始行
int startRow = ;
if (isFirstRowColumn)
{
startRow = ;
} //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 == ) && ((i == ) || (i == )))
{
//特殊的几个单元格 转换为 日期格式
value = ToDateTimeValue(cell.NumericCellValue.ToString());
}
}
else
{
//row.GetCell(j).SetCellType(CellType.String);
value = cell.StringCellValue;
}
}
NewRow[j] = value;
}
myTable.Rows.Add(NewRow);
}
return myTable;
}
catch (Exception ex)
{
throw ex;
}
} /// <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();
} /// <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 转换为 datatable
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
OperationExcel _OperationExcel = new OperationExcel();
DataTable dt = _OperationExcel.ExcelToDataTable(, true, "21.xls");
} /// <summary>
/// datatable 转换为 html
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
OperationExcel _OperationExcel = new OperationExcel();
DataTable dt = _OperationExcel.ExcelToDataTable(, true, "21.xls");
textBox1.Text = _OperationExcel.GetHtmlString(dt);
} /// <summary>
/// datatable 转换为 json格式
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
OperationExcel _OperationExcel = new OperationExcel();
List<ExcelInfo> list = new List<ExcelInfo>();
list.Add(new ExcelInfo("21.xls", ));
list.Add(new ExcelInfo("22.xls", ));
list.Add(new ExcelInfo("23.xls", ));
list.ForEach(c =>
{
for (int i = ; i < c.SheetCount; i++)
{
DataTable dt = _OperationExcel.ExcelToDataTable(i, true, c.FileName);
string str = CreateStrObj(dt);
string num = c.FileName.Replace(".xls", "");
string fileName = $"Y{num}-{i + 1}.txt";
System.IO.File.WriteAllText($"txt//{fileName}", str);
}
});
MessageBox.Show("格式转换完成!");
} public string CreateStrObj(DataTable dt)
{
ZLInfo _ZLInfo = new ZLInfo(); //基本信息
_ZLInfo._桥梁名称 = dt.Rows[][].ToString();
_ZLInfo._构建类型 = dt.Rows[][].ToString();
_ZLInfo._构件编号 = dt.Rows[][].ToString();
_ZLInfo._张拉方式 = dt.Rows[][].ToString();
_ZLInfo._张拉日期 = "";
_ZLInfo._砼设计强度 = dt.Rows[][].ToString(); //详情数据
List<DetailInfor> list = new List<DetailInfor>();
int total = ;
for (int i = ; i < total; i++)
{
DetailInfor _DetailInfor = new DetailInfor();
_DetailInfor._孔道号 = dt.Rows[i * + ][].ToString();
_DetailInfor._张拉时间 = dt.Rows[][].ToString();
_DetailInfor._理论伸长量 = dt.Rows[][].ToString();
_DetailInfor._设计张力 = dt.Rows[][].ToString();
_DetailInfor._回缩量 = dt.Rows[][].ToString();
_DetailInfor._张拉力 = "";
_DetailInfor._油压 = dt.Rows[][].ToString();
_DetailInfor._伸长量 = "";
_DetailInfor._伸长量误差 = ""; _DetailInfor._千斤顶编号1 = dt.Rows[][].ToString();
_DetailInfor._初始油压1 = dt.Rows[][].ToString();
_DetailInfor._初始张拉力1 = dt.Rows[][].ToString();
_DetailInfor._初始伸长量1 = dt.Rows[][].ToString();
_DetailInfor._2倍初始油压1 = dt.Rows[][].ToString();
_DetailInfor._2倍初始张拉力1 = dt.Rows[][].ToString();
_DetailInfor._2倍初始伸长量1 = dt.Rows[][].ToString();
_DetailInfor._100油压1 = dt.Rows[][].ToString();
_DetailInfor._100张拉力1 = dt.Rows[][].ToString();
_DetailInfor._100伸长量1 = dt.Rows[][].ToString(); _DetailInfor._千斤顶编号2 = dt.Rows[][].ToString();
_DetailInfor._初始油压2 = dt.Rows[][].ToString();
_DetailInfor._初始张拉力2 = dt.Rows[][].ToString();
_DetailInfor._初始伸长量2 = dt.Rows[][].ToString();
_DetailInfor._2倍初始油压2 = dt.Rows[][].ToString();
_DetailInfor._2倍初始张拉力2 = dt.Rows[][].ToString();
_DetailInfor._2倍初始伸长量2 = dt.Rows[][].ToString();
_DetailInfor._100油压2 = dt.Rows[][].ToString();
_DetailInfor._100张拉力2 = dt.Rows[][].ToString();
_DetailInfor._100伸长量2 = dt.Rows[][].ToString();
_DetailInfor._是否合格 = "";
list.Add(_DetailInfor);
}
_ZLInfo._详情数据 = list; string str = JsonConvert.SerializeObject(_ZLInfo); str = str.Replace("_", "");
str = str.Replace("100油压", "100%油压").Replace("100张拉力", "100%张拉力").Replace("100伸长量", "100%伸长量"); return str;
}
相关的类
public class ExcelInfo
{
public string FileName { get; set; }
public int SheetCount { get; set; }
public ExcelInfo(string FileName, int SheetCount)
{
this.FileName = FileName;
this.SheetCount = SheetCount;
}
}
public class ZLInfo
{
public string _桥梁名称 { get; set; }
public string _构建类型 { get; set; }
public string _构件编号 { get; set; }
public string _张拉方式 { get; set; }
public string _张拉日期 { get; set; }
public string _砼设计强度 { get; set; }
public List<DetailInfor> _详情数据 { get; set; }
}
public class DetailInfor
{
public string _孔道号 { get; set; }
public string _张拉时间 { get; set; }
public string _理论伸长量 { get; set; }
public string _设计张力 { get; set; }
public string _回缩量 { get; set; }
public string _张拉力 { get; set; }
public string _油压 { get; set; }
public string _伸长量 { get; set; }
public string _伸长量误差 { get; set; }
public string _千斤顶编号1 { get; set; }
public string _初始油压1 { get; set; }
public string _初始张拉力1 { get; set; }
public string _初始伸长量1 { get; set; }
public string _2倍初始油压1 { get; set; }
public string _2倍初始张拉力1 { get; set; }
public string _2倍初始伸长量1 { get; set; }
public string _100油压1 { get; set; }
public string _100张拉力1 { get; set; }
public string _100伸长量1 { get; set; }
public string _千斤顶编号2 { get; set; }
public string _初始油压2 { get; set; }
public string _初始张拉力2 { get; set; }
public string _初始伸长量2 { get; set; }
public string _2倍初始油压2 { get; set; }
public string _2倍初始张拉力2 { get; set; }
public string _2倍初始伸长量2 { get; set; }
public string _100油压2 { get; set; }
public string _100张拉力2 { get; set; }
public string _100伸长量2 { get; set; }
public string _是否合格 { get; set; }
}
C# Excel转换为Json的更多相关文章
- 使用node.js将xmind导出的excel转换为json树
xmind文件如图所示, 最终生成的数据结构如图 2,选择导出为excel文件,导出的excel文件打开如图 3,安装node读取excel模块 cnpm i node-xlsx --save 4 ...
- js压缩xml字符串,将xml字符串转换为xml对象,将xml对象转换为json对象
/** * 压缩xml字符串 */ function compressXmlStr(str){ var prefix, suffix; var i = str.indexOf("\r&quo ...
- excel转json工具的制作(C#语言)
最近在做一个火炬之光的技能系统的demo,需要用到配置表工具. &在网上没有找到让自己满意的工具&自己感兴趣, so自己做了一个. 我使用的C#语言,用了网上的SimpleJSON工具 ...
- 数据集转换为Json
数据集转换为Json 第一步:新建一个类对象 通常我会写三个属性:状态.返回信息.数据集 第二步:新建一个JSON转换类 第三步:把类对象当做参数传入JSON转换类 ———————————————— ...
- JavaScript操作JSON的方法总结,JSON字符串转换为JSON对象
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意 ...
- 【荐】使用eval()、new Function()将JSON字符串转换为JSON对象
在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 第一种解析方式:使用eval函数来解析,并且使用j ...
- Excel转Json,Json转CSharp
一份给策划最好的礼物!就是:Excel2Json2CSharp 策划配置Excel,动不动就要改数值啊,增加字段啊. 程序这边对应的解析类就得改动啊.整一个麻烦了得! 所以我就整理了这个Excel2J ...
- js 将json字符串转换为json对象的方法解析
推荐: var obj = eval('(' + str + ')'); var last=JSON.stringify(obj); //将JSON对象转化为string字符 例如: JSON字符串: ...
- javaScript 将json字符串转换为json对象的方法解析
JSON字符串: var str1 = '{ "name": "cxh", "sex": "man" }'; JSON对 ...
随机推荐
- django-request获取数据
request 如果说 urls.py 是 Django 中前端页面和后台程序桥梁,那么 request 就是桥上负责运输的小汽车 可以说后端接收到的来至前端的信息几乎全部来自于requests中. ...
- 通过git将本地文件上传到码云的方法
1. 在码云上创建项目 在码云首页顶部,下图所示,右上角头像旁边的加号,鼠标移上去会显示下拉的,点击“新建项目”. 2. 安装Git 下载完成后安装即可,安装过程中没有注意事项,全部默认一直next直 ...
- GitHub万星的ML算法面试大全
项目地址:https://github.com/imhuay/Algorithm_Interview_Notes-Chinese 如下所示为整个项目的结构,其中从机器学习到数学主要提供的是笔记与面试知 ...
- MySQL高可用架构之基于MHA的搭建
一.MySQL MHA架构介绍: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Fa ...
- Elasticsearch5.5.2安装和启动遇到哪些问题
最近学习Elasticsearch,顺便记录下操作步骤,供日后参考 安装环境 CentOS release 6.6 1.因Elasticsearch是基于java写的,所以它的运行环境中需要java的 ...
- PHP读取txt文件到数组
$file_path = "test.txt"; if(file_exists($file_path)){ $file_arr = file($file_path); for($i ...
- python3基础:基本语句(2017)
http://www.cnblogs.com/qq21270/p/4591318.html 字符串.文本文件 http://www.cnblogs.com/qq21270/p/7872824.htm ...
- js提高篇
1定义一个方法 function aa(){alert(this)} 对于浏览器 这只是一个方法,那么this是什么的,this理所当然是document对象了..也就是说 打页面定义的方法 都是do ...
- JavaScript进行简单的随即验证码生成(适合和我一样刚入门一本完整的教材书都没看完的弟弟)
(感谢橙旭园给我打开了前端世界的大门) var checkcode = document.getElementById("code"); var btn = document.ge ...
- java接口的学习笔记
1接口 接口是一个特殊的类,在JAVA中,接口是由抽象方法和全局敞亮组成. 在JAVA忠使用INTERFACE定义接口. public class InterfaceDemo { public sta ...