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. WPF vs2015,vs2012 添加ArcObjects SDK

    一:如果是vs2015,找到注册表中HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\14.0\下面的这两个,并且将名称和数 ...

  2. 安全测试6_Web安全工具第二节(代理抓包分析工具)

    上节课讲了浏览器及扩展,这节课继续来学习下抓包分析. 首先看下下图,了解下代理工具的原理:代理就相当于收费站一样,任何要通过的车辆必须经过它. 浏览器的代理我们可以通过设置进行手动设置代理,或者通过P ...

  3. 关于Access导入Oracle会产生双引号的问题

    把Access2007的数据导入到oracle 10g xe中,成功了,可是在写sql语句时必须加双引号 ,如select “name” from “Product”,貌似是因为access为了防止列 ...

  4. gentoo raid1

    参考 gentoo wiki,和其他网页,实现两个硬盘组成 raid1. 两个硬盘一个是 sdc,一个是 sdd,都是 4T容量. 首先内核开启 Autodetect RAID arrays duri ...

  5. python中的partition、rpartition

    partition()从左向右寻找,以字符串中的某个元素为中心将左右分割共分割成三个元素并放入到元组中 partition()从右向左寻找,以字符串中的某个元素为中心将左右分割共分割成三个元素并放入到 ...

  6. Cannot run Eclipse; JVM terminated. Exit code=13

    在myeclipse 上运行好好的, 在 eclipse 上就运行不了了. 运行eclipse.exe 就出现: Cannot run Eclipse; JVM terminated. Exit co ...

  7. IP与十进制相互转化

    def ip2Long(ip: String): Long = { val fragments = ip.split("[.]")  var ipNum = 0L  for (i ...

  8. leetcode1020

    class Solution(object): def __init__(self): self.cons = 0 self.S = list() def dfs(self,m,n,v,A): whi ...

  9. linux-2.6.22.6 内核源代码包的文件目录介绍

    下载一个linux-2.6.22.6.tar并解压 再其解压的文件中加入下面的bat脚本 生成当前文件的目录树脚本如下: @rem 此BAT文件名一定不能是"tree.bat",否 ...

  10. java.lang.IllegalMonitorStateException异常

    转自:https://blog.csdn.net/qianshangding0708/article/details/48290937