ExcelDataReader 2.1.0:读取'%'之类的特殊字符

时间:2016-07-18 04:26:03

标签: asp.net-mvc excel streamreader exceldatareader

我在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

Excel Image

图片2:

HTML

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,这是一个悬而未决的问题。