当我想要在获得已经导出的excel,接着下面再进行导入时,我发现一个问题,就是如果我使用的时Dgv转 DataTable,然后直接使用DataTable导出时,就会导致重新加载的时候,所获得Dimension的数值非常的大。就无法获得真正所使用过了的行数。
我一开始以为是这个方法所获得得并不是我所理解得含义,所有就在网上一直找可以获得excel已使用得行数得代码。但是找了一圈都无法解决这个问题。然后就是我偶然间,发现,我所使用得直接通过value赋值得方式来输出得excel,是可以正确获得已使用得行数得。
由此,我就判断是datatable直接导出得原因,导致我无法获得正确得已使用得行数了。所以就是将
FileInfo newFile = new FileInfo(@filepath);
using (ExcelPackage package = new ExcelPackage(newFile))
{
ExcelWorksheet worksheet;
if (package.Workbook.Worksheets.Count > 0)
{
worksheet = package.Workbook.Worksheets.FirstOrDefault();
}
else
{
worksheet = package.Workbook.Worksheets.Add("test");
}
//获得当前已使用的维度
int currindex = worksheet.Dimension.End.Row;
}
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("test");//创建worksheet
worksheet.Cells[1, 1].Value = "名称";//直接指定行列数进行赋值
worksheet.Cells["A1"].Value = "名称";//直接指定单元格进行赋值
因此我推断,如果获得的数是一个很大的数,那么就是excel被“污染”了,我的处理方式是需要重新选择一个新的路径来完成;
直接使用dgv转datatable导出的excel,就会有这种问题。
所以建议如果要导出数据的话,并且有需要再次往excel里面进行写入数据的话,就需要通过自己的写数据的方式来进行,直接使用datatable可能会导致污染excel文件。我所使用的datatable是从dgv转到datatable,代码也是从网上copy的,可能也许是我生成的datatable不够规范也有可能。
private static DataTable GetDgvToTable(DataGridView dgv)
{
DataTable dt = new DataTable();
dt.TableName = "测量数据";
// 列强制转换
for (int count = 0; count < dgv.Columns.Count; count++)
{
System.Data.DataColumn dc = new System.Data.DataColumn(dgv.Columns[count].Name.ToString());
dt.Columns.Add(dc);
}
// 循环行
for (int count = 0; count < dgv.Rows.Count; count++)
{
DataRow dr = dt.NewRow();
for (int countsub = 0; countsub < dgv.Columns.Count; countsub++)
{
dr[countsub] = Convert.ToString(dgv.Rows[count].Cells[countsub].Value);
}
dt.Rows.Add(dr);
}
return dt;
}
总而言之。就是这样,因为我看epplus的官方程序,所使用的都是先将excel文件进行清理掉后再进行写入的。就和我的需求不太一样,然后就是这样,希望能够帮到大家解决一点小困惑。