请教C#导入导出Excel的问题(外部表不是预期的格式?) 采用webform开发,导出是通过分隔符的方式用Response直接写到客户端,无论是存为xls或csv都很正常,并可用excel打开,可是用导入时用myCommand.Fill(ds,"table1")的方式总是提示"外部表不是预期的格式"并出错退出,我用的是vs2005 + excel2003,不知应该怎么解决 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 那是因为Excel中的列对应有问题,也许是多出来一列或者少了一列 应该是你的excel和table1的结构不一致 结构不一致,可能excel中有TABLE1中不相同的格式 比如图片格式 那你换个方式,看看是否可以,参看http://www.codeproject.com/csharp/excel_using_oledb.asp Response出来的就是这个问题,虽然他生成excel很快,但再导入数据库的时候就有毛病,还是用excel.dll控件吧,这个绝对没有问题public void Out2Excel(string sTableName,string url) { Excel.Application oExcel=new Excel.Application(); Workbooks oBooks; Workbook oBook; Sheets oSheets; Worksheet oSheet; Range oCells; string sFile="",sTemplate=""; // System.Data.DataTable dt=TableOut(sTableName).Tables[0]; sFile=url+"\\myExcel.xls"; sTemplate=url+"\\MyTemplate.xls"; // oExcel.Visible=false; oExcel.DisplayAlerts=false; //定义一个新的工作簿 oBooks=oExcel.Workbooks; oBooks.Open(sTemplate,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing, Type.Missing, Type.Missing); oBook=oBooks.get_Item(1); oSheets=oBook.Worksheets; oSheet=(Worksheet)oSheets.get_Item(1); //命名该sheet oSheet.Name="Sheet1"; oCells=oSheet.Cells; //调用dumpdata过程,将数据导入到Excel中去 DumpData(dt,oCells); //保存 oSheet.SaveAs(sFile,Excel.XlFileFormat.xlTemplate,Type.Missing,Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing); oBook.Close(false, Type.Missing,Type.Missing); //退出Excel,并且释放调用的COM资源 oExcel.Quit(); GC.Collect(); KillProcess("Excel"); } private void KillProcess(string processName) { System.Diagnostics.Process myproc= new System.Diagnostics.Process(); //得到所有打开的进程 try { foreach (Process thisproc in Process.GetProcessesByName(processName)) { if(!thisproc.CloseMainWindow()) { thisproc.Kill(); } } } catch(Exception Exc) { throw new Exception("",Exc); } } 我也用了excel.dll这种方式,不过感觉10000条记录的时候很慢,而且要添加引用,真的很想知道用缓存的方式能不能实现,我打算用Response保存文件后,用打开文本文件的方式访问,不过有1列数据是规格型号,像什么,§|这些字符都可能被用到,有的列是空的所以空格也不好办,有点郁闷哪 用excel.dll确实比较慢,感觉10000条大概要1分多钟 TO:Knight94(愚翁) 你给的地址代码下载不了 外部表不是预期格式,原因一般有2个1 是连接字符串问题2 是excel文件的版本问题excel文件版本要和连接字符串里的xls版本对应才能正确读写若是excel文件2.1,那用oledb是无法打开读取的,除非你的excel版本是97。要用excel对象访问 我也碰到过,主要是excel表里面的列与dataset里面的列不匹配的问题 TO:Knight94(愚翁)我注册了,奇怪了啊:《 最终是用DataGrid通过Response导出成Excel格式,在页面直接打开,然后让用户另存为正式Excel格式,再导入就可以了 ,碰到同样的问题,我是用reporting service导出的excel,再导入,就报错:外部表不是预期的格式另存为,就可以正常导入; 我的问题解决,原来是reporting services没有升级为sp2 IntPtr 相关 C# ::运算符的作用。通俗一点说明一下,谢谢。 Datagridview问题 求助:如何根据DataSet在数据库中自动创建表 麦克风音量控制 大神们看看啊,为什么用openFileDialog打开的图片显示不了 如何从ASCII码转换为string(中文)? 请教一个XML的问题. win8和windows server 2012哪个作C#开发的操作系统比较合适 不处理task中的异常会怎么样? 如何筛选出dataTable中的新增的行 两个大数相加,怎么处理。 急,在线等!
http://www.codeproject.com/csharp/excel_using_oledb.asp
public void Out2Excel(string sTableName,string url)
{
Excel.Application oExcel=new Excel.Application();
Workbooks oBooks;
Workbook oBook;
Sheets oSheets;
Worksheet oSheet;
Range oCells;
string sFile="",sTemplate="";
//
System.Data.DataTable dt=TableOut(sTableName).Tables[0]; sFile=url+"\\myExcel.xls";
sTemplate=url+"\\MyTemplate.xls";
//
oExcel.Visible=false;
oExcel.DisplayAlerts=false;
//定义一个新的工作簿
oBooks=oExcel.Workbooks;
oBooks.Open(sTemplate,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing, Type.Missing, Type.Missing);
oBook=oBooks.get_Item(1);
oSheets=oBook.Worksheets;
oSheet=(Worksheet)oSheets.get_Item(1);
//命名该sheet
oSheet.Name="Sheet1"; oCells=oSheet.Cells;
//调用dumpdata过程,将数据导入到Excel中去
DumpData(dt,oCells);
//保存
oSheet.SaveAs(sFile,Excel.XlFileFormat.xlTemplate,Type.Missing,Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing);
oBook.Close(false, Type.Missing,Type.Missing);
//退出Excel,并且释放调用的COM资源
oExcel.Quit(); GC.Collect();
KillProcess("Excel");
} private void KillProcess(string processName)
{
System.Diagnostics.Process myproc= new System.Diagnostics.Process();
//得到所有打开的进程
try
{
foreach (Process thisproc in Process.GetProcessesByName(processName))
{
if(!thisproc.CloseMainWindow())
{
thisproc.Kill();
}
}
}
catch(Exception Exc)
{
throw new Exception("",Exc);
}
}
你给的地址代码下载不了
1 是连接字符串问题
2 是excel文件的版本问题
excel文件版本要和连接字符串里的xls版本对应才能正确读写
若是excel文件2.1,那用oledb是无法打开读取的,除非你的excel版本是97。要用excel对象访问
我注册了,奇怪了啊:《
:外部表不是预期的格式
另存为,就可以正常导入;