目的:用户通过界面点击导出EXCEL后,在导出的文件上做修改,再将其导入
1,我用直接从datagrid中导出的方法导出Excel,这时做导入时遇到外部表不是

解决方案 »

  1.   

    目的:用户通过界面点击导出EXCEL后,在导出的文件上做修改,再将其导入  
    1,我用直接从datagrid中导出的方法导出Excel,这时做导入时遇到外部表不是
      预期的格式。
    2. 我用OWC11导出EXCEL后,同样也时在导入遇到外部表不是预期的格式。它看起来和
    标准的EXCEL文件没有区别,我不知道是什么原因
    想向大家寻求一种较好的导出方法,希望能在导出的文件上能再导入,且方便部署。
    请大家帮帮忙喔
      

  2.   

    导入时要用到OLEDB连接到Excel.
      

  3.   

    参考
    Excel文件的读取
    public DataSet ExcelToDS(string Path)
    {
     string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source="+ Path +";"+"Extended Properties=Excel 8.0;";
     OleDbConnection conn = new OleDbConnection(strConn);
     conn.Open();  
     string strExcel = "";   
     OleDbDataAdapter myCommand = null;
     DataSet ds = null;
     strExcel="select * from [sheet1$]";
     myCommand = new OleDbDataAdapter(strExcel, strConn);
     ds = new DataSet();
     myCommand.Fill(ds,"table1");   
     return ds;
    }
    对于EXCEL中的表即sheet([sheet1$])如果不是固定的可以使用下面的方法得到
     string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source="+ Path +";"+"Extended Properties=Excel 8.0;";
     OleDbConnection conn = new OleDbConnection(strConn);
     DataTable schemaTable = objConn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables,null);
     string tableName=schemaTable.Rows[0][2].ToString().Trim();  
    Excel文件的写入
    public void DSToExcel(string Path,DataSet oldds)
    {
     //先得到汇总EXCEL的DataSet 主要目的是获得EXCEL在DataSet中的结构
     string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source ="+path1+";Extended Properties=Excel 8.0" ;
     OleDbConnection myConn = new OleDbConnection(strCon) ;
     string strCom="select * from [Sheet1$]";
     myConn.Open ( ) ;
     OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom, myConn ) ;
     ystem.Data.OleDb.OleDbCommandBuilder builder=new OleDbCommandBuilder(myCommand);
     //QuotePrefix和QuoteSuffix主要是对builder生成InsertComment命令时使用。
     builder.QuotePrefix="[";     //获取insert语句中保留字符(起始位置)
     builder.QuoteSuffix="]"; //获取insert语句中保留字符(结束位置)
     DataSet newds=new DataSet();
     myCommand.Fill(newds ,"Table1") ;
     for(int i=0;i<oldds.Tables[0].Rows.Count;i++)
     {
      //在这里不能使用ImportRow方法将一行导入到news中,因为ImportRow将保留原来DataRow的所有设置(DataRowState状态不变)。在使用ImportRow后newds内有值,但不能更新到Excel中因为所有导入行的DataRowState!=Added
      DataRow nrow=aDataSet.Tables["Table1"].NewRow();
      for(int j=0;j<newds.Tables[0].Columns.Count;j++)
      {
       nrow[j]=oldds.Tables[0].Rows[i][j];
      }
      newds.Tables["Table1"].Rows.Add(nrow);
     }
     myCommand.Update(newds,"Table1");
     myConn.Close();
    }
      

  4.   

    我的问题是会在myCommand.Fill(newds ,"Table1") ;这句报出外部表不是预期的格式。
    当我把导出的EXCEL文件内容复制到一个新的excel后,就可导入了。
    好像是内容都是标准的,就是导出的excel文件有问题,这是为什么?
      

  5.   

    对,就是导出时不知是修改了什么,它就是和新建的excel文件有区别
      

  6.   

    int i=0;
    int j=0;
    OWC11.SpreadsheetClass xlsheet=new OWC11.SpreadsheetClass();
    //输出标题
    foreach (DataColumn dsItems in ds.Tables[0].Columns)
    {
        xlsheet.ActiveSheet.Cells[1,i+1]=dsItems.ColumnName;
       //xlsheet.ActiveSheet.Cells[1, i + 1]Font.Bold = True;
       //设置格式
       xlsheet.ActiveSheet.get_Range(xlsheet.Cells[1, 1], xlsheet.Cells[1, i + 1]).Font.set_Name("宋体");
       xlsheet.ActiveSheet.get_Range(xlsheet.Cells[1, 1], xlsheet.Cells[1, i + 1]).Font.set_Bold(true);
       xlsheet.ActiveSheet.get_Range(xlsheet.Cells[1, 1], xlsheet.Cells[1, i + 1]).Font.set_Size(10);
    i = i + 1;
    }
    //输出字段
    int count=ds.Tables[0].Rows.Count;
    int numbercols=ds.Tables[0].Columns.Count;
    for (i=0;i<count-1;i++)
    {
        for (j=0;j<numbercols;j++)
        {
           xlsheet.ActiveSheet.Cells[i + 2, j + 1] = ds.Tables[0].Rows[i][j].ToString().Replace("&nbsp;", " ").Trim();
         }
    }
    try
    {//注意导出时不同产生同名,否则会产生异常0xE004002A
    xlsheet.Export(tmpAddr,OWC11.SheetExportActionEnum.ssExportActionNone,OWC11.SheetExportFormat.ssExportAsAppropriate);
    return true;
    }
    catch
    {
       return false;
    }
      

  7.   

    你的问题是:EXCEL的工作表的名称与你 SELECT 语句中的表名称不一致造成的222!!![Sheet1$]  ???
      

  8.   

    你看看 Excel左下脚:是Sheet1,还是别的名称!?最好和你SELECT * from [Sheet1$] 语句中的表名是至的···
      

  9.   

    不同意楼上的,这个问题我也遇到了,实在打开连接时就出错了,错误的原因是:导出的Excel文件格式有问题,但不知道怎么解决?
      

  10.   

    excel 组件版本不对,适当改一下。
    代码要与excel组件版本一至。