我在MVC应用程序中使用名为 ExcelDataReader 的nuget包来读取Excel工作表并将其转换为HTML。所有声音都很糟糕但我无法从Excel工作表中读取特殊字符。例如是单元格值是“59%”,但它的读数是0.59。所以如何从excel获得完全相同的字符串值。我在Controller中使用以下代码来读取和显示excel到html。
public ActionResult ViewExcelFileData(long? id, int sheetindex)
{
var excelfile = db.ExcelUpload.FirstOrDefault(x => x.FileID == id);
string filePath= string.Format(Server.MapPath("~/App_Data/ExcelUploads/Labor_Excel/") + excelfile.FileName);
System.IO.File.GetAccessControl(filePath);
FileStream stream = System.IO.File.Open(filePath, FileMode.Open, FileAccess.Read);
IExcelDataReader reader = null;
if (excelfile.FileName.EndsWith(".xls"))
{
reader = ExcelReaderFactory.CreateBinaryReader(stream);
}
else if (excelfile.FileName.EndsWith(".xlsx"))
{
reader = ExcelReaderFactory.CreateOpenXmlReader(stream);
}
reader.IsFirstRowAsColumnNames = true;
DataSet result = reader.AsDataSet();
reader.Close();
return View(result.Tables[sheetindex]);
}
通过在View端返回数据表我在Cshtml中使用了以下代码。
<table class="gridtable" id="table-1">
<thead class="fixed_headers">
<tr>
@foreach (DataColumn col in Model.Columns)
{
<th>@col.ColumnName</th>
}
</tr>
</thead>
<tbody>
@foreach (DataRow row in Model.Rows)
{
<tr>
@foreach (DataColumn col in Model.Columns)
{
<td>@row[col.ColumnName]</td>
}
</tr>
}
</tbody>
</table>
那么在控制器端或View端是否可以得到 59%而不是0.59?
这是两个图像,其中一个属于excel,第二个是HTML。
IMAGE:1
图片2:
答案 0 :(得分:0)
您可以逐个读取行并将值读为字符串,而不是使用AsDataSet()
方法。为此,需要一个一个地指定列,这是一个可维护性问题。
while (reader.Read())
{
var value = reader.GetString(0); //Get value of first column
}
我怀疑AsDataSet()
将数据转换为各自的数据类型,这就是为什么你看到转换的十进制值而不是excel中的实际值。
答案 1 :(得分:0)
ExcelDataReader当前不公开任何格式信息,它为您提供原始值,但转换为DateTime的日期除外。
关于扩展它以提供格式化信息https://github.com/ExcelDataReader/ExcelDataReader/issues/215,这是一个悬而未决的问题。