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 = "&nbsp;";//如果是NULL则在HTML里面使用一个空格替换之
}
if (obj.ToString() == "")
{
obj = "&nbsp;";
}
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的更多相关文章

  1. 使用node.js将xmind导出的excel转换为json树

    xmind文件如图所示, 最终生成的数据结构如图  2,选择导出为excel文件,导出的excel文件打开如图 3,安装node读取excel模块 cnpm i  node-xlsx --save 4 ...

  2. js压缩xml字符串,将xml字符串转换为xml对象,将xml对象转换为json对象

    /** * 压缩xml字符串 */ function compressXmlStr(str){ var prefix, suffix; var i = str.indexOf("\r&quo ...

  3. excel转json工具的制作(C#语言)

    最近在做一个火炬之光的技能系统的demo,需要用到配置表工具. &在网上没有找到让自己满意的工具&自己感兴趣, so自己做了一个. 我使用的C#语言,用了网上的SimpleJSON工具 ...

  4. 数据集转换为Json

    数据集转换为Json 第一步:新建一个类对象  通常我会写三个属性:状态.返回信息.数据集 第二步:新建一个JSON转换类 第三步:把类对象当做参数传入JSON转换类 ———————————————— ...

  5. JavaScript操作JSON的方法总结,JSON字符串转换为JSON对象

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意 ...

  6. 【荐】使用eval()、new Function()将JSON字符串转换为JSON对象

    在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 第一种解析方式:使用eval函数来解析,并且使用j ...

  7. Excel转Json,Json转CSharp

    一份给策划最好的礼物!就是:Excel2Json2CSharp 策划配置Excel,动不动就要改数值啊,增加字段啊. 程序这边对应的解析类就得改动啊.整一个麻烦了得! 所以我就整理了这个Excel2J ...

  8. js 将json字符串转换为json对象的方法解析

    推荐: var obj = eval('(' + str + ')'); var last=JSON.stringify(obj); //将JSON对象转化为string字符 例如: JSON字符串: ...

  9. javaScript 将json字符串转换为json对象的方法解析

    JSON字符串: var str1 = '{ "name": "cxh", "sex": "man" }'; JSON对 ...

随机推荐

  1. 对mysql事务提交、回滚的错误理解

    一.起因 begin或者START TRANSACTION开始一个事务 rollback事务回滚 commit 事务确认 人们对事务的解释如下:事务由作为一个单独单元的一个或多个SQL语句组成,如果其 ...

  2. Intorduction To Computer Vision

    本文将主要介绍图像分类问题,即给定一张图片,我们来给这张图片打一个标签,标签来自于预先设定的集合,比如{people,cat,dog...}等,这是CV的核心问题,图像分类在实际应用中也有许多变形,而 ...

  3. Echarts动态加载饼状图的实例

    一.引入echarts.js文件(下载页:http://echarts.baidu.com/download.html) 二.HTML代码: <div style="width: 10 ...

  4. leetcode 852. Peak Index in a Mountain Array

    Input: [0,1,0] Output: 1 Input: [0,2,1,0] Output: 1解: 比较数组中的i和i-1的大小,如果前一位大于后一位数字,前一位则是结果 let ans = ...

  5. git回滚到某个版本操作

    git回滚到某个版本操作: 1.git log //查看指过去的版本 2.     git reset --hard 复制上面commit后的字符串到此处 如果只想 回滚单机的,那么到上面就结束,如果 ...

  6. gentoo wireshark 安装

    安装软件 emerge --ask net-analyzer/wireshark 把用户加入 wireshark 组. gpasswd -a $USER wireshark 如果不像重新登录就可以使用 ...

  7. 数据持久化—真机上的Plist写入

    其实写入不到真机里面主要是你写入时,当前那文件夹里你要写入的plist根本不存在 所以你怎么写都写不进去,所以你必须先创建你要写入的plist; 你用这样初始化程序就能自己创建: NSMutableA ...

  8. 解决在V2.0中子组件使用v-model接收来自父组件的值异常

    当我们使用父组件向子组件传值,当子组件中是v-model使用该值时会报:[Vue warn]: Avoid mutating a prop directly since the value will ...

  9. 浅谈测试驱动开发(TDD)

    测试驱动开发(TDD)是极限编程的重要特点,它以不断的测试推动代码的开发,既简化了代码,又保证了软件质量.本文从开发人员使用的角度,介绍了 TDD 优势.原理.过程.原则.测试技术.Tips 等方面. ...

  10. Apache-Axis小结

    以前用过axis, 不过好久不弄, 有忘记了.很多很多东西放在收藏夹里面, 但是长时间不去看,结果就是还是不熟悉!现在再简单总结一下吧. Axis开发服务器端webservice其实很简单. 1 下载 ...