asp.net Excel 导入导出错误System.Data.OleDb.OleDbException: 外部表不是预期的格式。

wode421898419 2009-01-04 03:04:06
我需要把数据导出为Excel,然后读取,但报错System.Data.OleDb.OleDbException: 外部表不是预期的格式。
如果是新建的Excel就没问题.
在网上查了下,好多都说是Excel的格式问题,但目前仍然没有找到解决的方法,希望各位高手指点一下
...全文
3036 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
LiveCoding 2012-02-02
  • 打赏
  • 举报
回复
OleConn.Open();我的程序在这里停了,不报错也不怎样?????
求高手解决!!!!!!!!!
反正xls文件是存在的!!!!!!!
tang253 2011-03-14
  • 打赏
  • 举报
回复
操作 excel 2007 总是出现问题 好头疼
van430606 2010-10-05
  • 打赏
  • 举报
回复
匯出的資料是不是Html格式的啊 . 記得把檔案另存為.xls格式噢.....試一下
pengjianbin04 2010-04-08
  • 打赏
  • 举报
回复
我在ASP.NET下导入excel到数据库sql2005时也遇到这个问题啦!
wode421898419 2009-01-07
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 homesos 的回复:]
引用 10 楼 wode421898419 的回复:
引用 2 楼 glt3260053 的回复:
引用 1 楼 net_lover 的回复:
从页面上导出的格式是一种兼容html的格式,你可以试试别的方法:
如导出成xml格式,或者不用导出,直接读取原数据

直接读取原数据

不能这样呀,我需要实现的是用户下载Excel,然后对里面的数据进行修改,在导入

报错信息:
System.Data.OleDb.OleDbException: 外部表不是预期的格式。 在 System.Data.OleDb.OleDbC…
[/Quote]
代码看起来蛮复杂的
homesos 2009-01-04
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wode421898419 的回复:]
引用 2 楼 glt3260053 的回复:
引用 1 楼 net_lover 的回复:
从页面上导出的格式是一种兼容html的格式,你可以试试别的方法:
如导出成xml格式,或者不用导出,直接读取原数据

直接读取原数据

不能这样呀,我需要实现的是用户下载Excel,然后对里面的数据进行修改,在导入

报错信息:
System.Data.OleDb.OleDbException: 外部表不是预期的格式。 在 System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConne…
[/Quote]
你用我那个7楼的代码导入试试,应该没什么问题。

我给你的是导入导出的代码。
jadedm 2009-01-04
  • 打赏
  • 举报
回复
Mark !
wode421898419 2009-01-04
  • 打赏
  • 举报
回复
protected void btnDownload_Click(object sender, EventArgs e)
{
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("Content-Disposition","attachment;filename=Sheet1.xls");
Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");

Response.Write("<table border='1'>");
Response.Write("<tr>");
Response.Write("<td align='center' colspan='4'>注:请注意大小写、全角与半角、-和_、:和;小区名称必须是:460-00-XXXXX-XXXXX</td>");
Response.Write("</tr>");
Response.Write("<tr>");
Response.Write("<td align='center'>网元名</td>");
Response.Write("<td align='center'>基站名</td>");
Response.Write("<td align='center'>小区名</td>");
Response.Write("<td align='center'>是否为工程小区(默认为否)</td>");
Response.Write("</tr>");
Response.Write("<tr>");
Response.Write("<td align='center'>CDGBSC442</td>");
Response.Write("<td align='center'>CDGBSC445:S14:</td>");
Response.Write("<td align='center'>460-00-29542-11441</td>");
Response.Write("<td align='center'>否</td>");
Response.Write("</tr>");
Response.Write("<tr>");
Response.Write("<td align='center'>CDGBSC443</td>");
Response.Write("<td align='center'>CDGBSC445:S14:</td>");
Response.Write("<td align='center'>460-00-29542-11442</td>");
Response.Write("<td align='center'>否</td>");
Response.Write("</tr>");
Response.Write("<tr>");
Response.Write("<td align='center'>CDGBSC445</td>");
Response.Write("<td align='center'>CDGBSC445:S14:</td>");
Response.Write("<td align='center'>460-00-29542-11443</td>");
Response.Write("<td align='center'>否</td>");
Response.Write("</tr>");
Response.Write("<tr>");
Response.Write("<td align='center'>CDGBSC445</td>");
Response.Write("<td align='center'>CDGBSC445:S22:</td>");
Response.Write("<td align='center'>460-00-29542-10221 </td>");
Response.Write("<td align='center'>否</td>");
Response.Write("</tr>");
Response.Write("<tr>");
Response.Write("<td align='center'>CDGBSC445</td>");
Response.Write("<td align='center'>CDGBSC445:S22:</td>");
Response.Write("<td align='center'>460-00-29542-10222 </td>");
Response.Write("<td align='center'>否</td>");
Response.Write("</tr>");
Response.Write("<tr>");
Response.Write("<td align='center'>CDGBSC445</td>");
Response.Write("<td align='center'>CDGBSC445:S22:</td>");
Response.Write("<td align='center'>460-00-29542-10223 </td>");
Response.Write("<td align='center'>否</td>");
Response.Write("</tr>");
Response.Write("<tr>");
Response.Write("<td align='center' colspan='4'>以上为试例,请从下行可以填写</td>");
Response.Write("</tr>");

string SqlString = "select * from web_site";//查询表
try
{
DataTable dt = dbc.GetDataTable(SqlString);
foreach (DataRow Row in dt.Rows)
{
Response.Write("<tr>");
Response.Write("<td align='center'>" + Row["wy_name"].ToString() + "</td>");
Response.Write("<td align='center'>" + Row["jz_name"].ToString() + "</td>");
Response.Write("<td align='center'>" + Row["xq_name"].ToString() + "</td>");
Response.Write("<td align='center'>否</td>");
Response.Write("</tr>");
}
}
catch (Exception ex)
{
Response.Write("<script>alert('"+ex.ToString()+"')</script>");
}
Response.Write("</table>");
Response.End();
}

这个是导出Excel的代码
xwk789xwk 2009-01-04
  • 打赏
  • 举报
回复
学习一下
wode421898419 2009-01-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 glt3260053 的回复:]
引用 1 楼 net_lover 的回复:
从页面上导出的格式是一种兼容html的格式,你可以试试别的方法:
如导出成xml格式,或者不用导出,直接读取原数据

直接读取原数据
[/Quote]
不能这样呀,我需要实现的是用户下载Excel,然后对里面的数据进行修改,在导入

报错信息:
System.Data.OleDb.OleDbException: 外部表不是预期的格式。 在 System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection) 在 System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject) 在 System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup) 在 System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) 在 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 在 System.Data.OleDb.OleDbConnection.Open() 在 Netsource.btn_dr_Click(Object sender, EventArgs e) 位置 e:\InfoNet_zliuy\Netsource.aspx.cs:行号 1092
-------------------------------------------
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties='Excel 8.0;HDR=False;IMEX=1'";
OleDbConnection OleConn = new OleDbConnection(strConn);
OleConn.Open();//这里行号为1092
string sql = "select * from [Sheet1$]";
homesos 2009-01-04
  • 打赏
  • 举报
回复
上面的导出代码,不会将EXCEL保存到硬盘,它会打开一个新的EXCEL文件,然后往这个EXCEL文件中一行行写入数据,这个EXCEL文件需要用户自己保存。
homesos 2009-01-04
  • 打赏
  • 举报
回复

//导出EXCEL示例:
Excel.ApplicationClass excel = new Excel.ApplicationClass();
excel.Application.Workbooks.Add(true);
excel.Visible = true;

Worksheet sheet = ((Worksheet)excel.ActiveWorkbook.Sheets[1]);

int iRowCount = dataGridView1.Rows.Count;
int iColCount = dataGridView1.ColumnCount;

for (int k = 0; k < iColCount; k++)
{
excel.Cells[1, k + 1] = dataGridView1.Columns[k].HeaderText;
}

for (int i = 0; i < iRowCount; i++)
{
for (int j = 0; j < iColCount; j++)
{
excel.Cells[i + 2, j + 1] = dataGridView1.Rows[i].Cells[j].Value;

if ((1 == j) && ("★未匹配" == dataGridView1.Rows[i].Cells[j].Value))
{
sheet.get_Range(sheet.Cells[i + 2, j + 1], sheet.Cells[i + 2, j + 1]).Font.Color = System.Drawing.Color.Blue.ToArgb();
}
}
}
homesos 2009-01-04
  • 打赏
  • 举报
回复

#region 导入EXCEL
public static System.Data.DataTable ExcelToDS_manual(string filePath)
{
//创建Application对象
Excel.Application xApp = new Excel.ApplicationClass();
xApp.Visible = true;
Excel.Workbook xBook = xApp.Workbooks._Open(filePath,
Missing.Value, Missing.Value, Missing.Value, Missing.Value
, Missing.Value, Missing.Value, Missing.Value, Missing.Value
, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

Excel.Worksheet xSheet = (Excel.Worksheet)xBook.Sheets[1];

int iColCount = 0;
int iRowCount = 0;

System.Data.DataTable dtExcel = new System.Data.DataTable();

//获取列数
string strColName;
for (int iColIndex = 1; ; iColIndex++)
{
if (null == ((Excel.Range)xSheet.Cells[1, iColIndex]).Value2)
{
break;
}

strColName = ((Excel.Range)xSheet.Cells[1, iColIndex]).Value2.ToString();
if (!string.IsNullOrEmpty(strColName))
{
iColCount++;
}
else
{
break;
}

System.Data.DataColumn newColumn = new DataColumn(strColName);
dtExcel.Columns.Add(newColumn);
}


int iNullRowCount = 0;
string strCellText;

for (int iRowIndex = 2; ; iRowIndex++)
{
if (null == ((Excel.Range)xSheet.Cells[iRowIndex, 1]).Value2)
{
if ((++iNullRowCount) >= 5)
{
break;
}

continue;
}

strCellText = ((Excel.Range)xSheet.Cells[iRowIndex, 1]).Value2.ToString();

if (!string.IsNullOrEmpty(strCellText))
{
iNullRowCount = 0;
}
else
{
if ((++iNullRowCount) >= 5)
{
break;
}
}

System.Data.DataRow newRow = dtExcel.NewRow();
for (int iColIndex = 1; iColIndex <= iColCount; iColIndex++)
{
if (null == ((Excel.Range)xSheet.Cells[iRowIndex, iColIndex]).Value2)
{
continue;
}

newRow[iColIndex - 1] = ((Excel.Range)xSheet.Cells[iRowIndex, iColIndex]).Value2.ToString();
}
dtExcel.Rows.Add(newRow);
}


xSheet = null;
xBook.Close(Missing.Value, Missing.Value, Missing.Value);
xBook = null;
xApp.Quit();
xApp = null;

return dtExcel;
}
#endregion
homesos 2009-01-04
  • 打赏
  • 举报
回复
以单元格形式导入,虽然效率差一些,但可以非常有效地避免空行、空列、列内容类型多内容读不进去(列内容有纯数字或纯字母内容时)的问题。
homesos 2009-01-04
  • 打赏
  • 举报
回复
是EXCEL格式的问题,应该定位一下问题出在哪,看一下具体错误信息或出错现场信息。

或者不使用OLE导入,直接以读取EXCEL单元格的形式导入。
shuangziye 2009-01-04
  • 打赏
  • 举报
回复
会不会是你电脑上装的是excel2007啊,我想如果是2003应该不会报这样的错吧,只是猜测,当时我导出excel时,反正是电脑若是excel2007,导出时报错了
Jack2013tong 2009-01-04
  • 打赏
  • 举报
回复
问题是出在Excel的格式上,调试下看看具体出错的位置
glt3260053 2009-01-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 net_lover 的回复:]
从页面上导出的格式是一种兼容html的格式,你可以试试别的方法:
如导出成xml格式,或者不用导出,直接读取原数据
[/Quote]
直接读取原数据
孟子E章 2009-01-04
  • 打赏
  • 举报
回复
从页面上导出的格式是一种兼容html的格式,你可以试试别的方法:
如导出成xml格式,或者不用导出,直接读取原数据

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧