excel转成DataTable时数据丢失问题

72 篇文章 0 订阅
41 篇文章 0 订阅

这里涉及到几个问题,首先,在excel转成DataTable时,如果Excel的列中每一行的数据类型不一样,转成DataTable数据会丢失,解决方法就是先将excel文件转成csv文件,但是这个是由程序来完成的,不是手动完成。如下代码:


/// <summary>
/// 将excel文件另存csv文件
/// </summary>
/// <param name="excelFileName">Excel文件路径</param>
/// <param name="csvFileName">csv文件路径</param>
public static void SaveAsExcel(string excelFileName,string csvFileName)
{
//定义一个COM中空类型的对象(作用类似于大家所熟悉的null)
object missing = System.Reflection.Missing.Value;

//创建Excel应用程序对象(会帮我们在启动Excel进程)
Excel.Application app = new Excel.ApplicationClass();

Workbook wb = app.Application.Workbooks.Open(excelFileName,missing,missing,missing,missing,missing,missing,missing,
missing,missing,missing,missing,missing,missing,missing);
//不出现提示,用默认的选择
app.Application.DisplayAlerts = false;
//不运行excel界面
app.Application.Visible = false;

Excel.Worksheet sheet = (Excel.Worksheet)wb.ActiveSheet;
try
{
//另存为csv格工,注意Excel.XlFileFormat.xlCSV参数,要另存为别的格式,也是在这里设置
sheet.SaveAs(csvFileName, Excel.XlFileFormat.xlCSV, missing, missing, false, false, false, missing, missing, false);
}
finally
{

wb.Close(false, missing, missing);

app.Quit();
}
}


当然前提条件是你要加入Mircosoft.Excel.core 11 COM组件(添加引用).

接下来,将cvs写入DataTable,这里用流写入。


/// <summary>
/// 将csv文件中的数据转成dataTabel
/// </summary>
/// <param name="path">csv路径</param>
/// <returns>DataTable</returns>
public DataTable CSVToDS(string path)
{
String line;
String[] split = null;
DataTable table = new DataTable("auto");
DataRow row = null;
StreamReader sr = new StreamReader(path,Encoding.Default);

//创建与数据源对应的数据列
line = sr.ReadLine();
split = line.Split(',');
foreach (String colname in split)
{
table.Columns.Add(colname, System.Type.GetType("System.String"));
}
//将数据填入数据表
int j = 0;
while ((line = sr.ReadLine()) != null)
{
j = 0;
row = table.NewRow();
split = line.Split(',');
foreach (String colname in split)
{
row[j] = colname;
j++;
}
table.Rows.Add(row);
}
sr.Close();
//显示数据
return table;
}

由于csv保存内容是以逗号分隔,所以在这里也要用逗号分隔。

第二个问题,创建Excel文件不符合标准。如果用File.Create()方法创建的Excel,用oleDBConnetion创建连接时,将无法创建连接,所以不能以此方法创建Excel文件。用如下方法:

/// <summary>
/// 创建excel文件
/// </summary>
/// <param name="fileName">文件名</param>
/// <param name="headerList">excel文件头</param>
public static void CreateFile(string fileName,List<string> headerList)
{
if (!File.Exists(fileName))
{
//定义一个COM中空类型的对象(作用类似于大家所熟悉的null)
object missing = System.Reflection.Missing.Value;

//创建Excel应用程序对象(会帮我们在启动Excel进程)
Excel.Application app = new Excel.ApplicationClass();

//在Excel中新建一个工作簿
app.Application.Workbooks.Add(true);

//取得当前的工作簿(刚才新建的那个)
Excel.Workbook books = (Excel.Workbook)app.ActiveWorkbook;

//从当前的工作簿中取得当前活动的工作表
Excel.Worksheet sheets = (Excel.Worksheet)books.ActiveSheet;

//通过行和列直接写入数据到指定单元格(第2行第2列,即"B2")
for (int i = 0; i < headerList.Count; i++)
{
sheets.Cells[1, i + 1] = headerList[i];
}

//保存文件
books.SaveCopyAs(fileName);

//关闭文件
books.Close(false, missing, missing);

//退出Excel
app.Quit();
}
}

这里的fileName是你要创建Excel文件的绝对路径,headerList是要预存的Excel文件标题.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值