DataSet导出到Excel比较完整的解决方案(二)--服务器端生成文件(downmoon)

前一篇文章中,介绍了DataSet导出到Excel时客户端生成文件的几种思路,接着往下说,服务器端生成文件,用户直接下载,应该格式是可以保证的!

于是直接调用Excel的API生成。代码如下:

ContractedBlock.gif ExpandedBlockStart.gif DataSetToLocalExcel
 public static void DataSetToLocalExcel(DataSet dataSet, string outputPath, bool deleteOldFile)
ExpandedBlockStart.gifContractedBlock.gif        
{
            
if (deleteOldFile)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
ExpandedSubBlockStart.gifContractedSubBlock.gif                
if (System.IO.File.Exists(outputPath)) { System.IO.File.Delete(outputPath); }
            }

            
// Create the Excel Application object
            ApplicationClass excelApp = new ApplicationClass();

            
// Create a new Excel Workbook
            Workbook excelWorkbook = excelApp.Workbooks.Add(Type.Missing);

            
int sheetIndex = 0;

            
// Copy each DataTable
            foreach (System.Data.DataTable dt in dataSet.Tables)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{

                
// Copy the DataTable to an object array
                object[,] rawData = new object[dt.Rows.Count + 1, dt.Columns.Count];

                
// Copy the column names to the first row of the object array
                for (int col = 0; col < dt.Columns.Count; col++)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    rawData[
0, col] = dt.Columns[col].ColumnName;
                }


                
// Copy the values to the object array
                for (int col = 0; col < dt.Columns.Count; col++)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    
for (int row = 0; row < dt.Rows.Count; row++)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
{
                        rawData[row 
+ 1, col] = dt.Rows[row].ItemArray[col];
                    }

                }


                
// Calculate the final column letter
                string finalColLetter = string.Empty;
                
string colCharset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
                
int colCharsetLen = colCharset.Length;

                
if (dt.Columns.Count > colCharsetLen)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    finalColLetter 
= colCharset.Substring(
                        (dt.Columns.Count 
- 1/ colCharsetLen - 11);
                }


                finalColLetter 
+= colCharset.Substring(
                        (dt.Columns.Count 
- 1% colCharsetLen, 1);

                
// Create a new Sheet
                Worksheet excelSheet = (Worksheet)excelWorkbook.Sheets.Add(
                    excelWorkbook.Sheets.get_Item(
++sheetIndex),
                    Type.Missing, 
1, XlSheetType.xlWorksheet);

                excelSheet.Name 
= dt.TableName;

                
// Fast data export to Excel
                string excelRange = string.Format("A1:{0}{1}",
                    finalColLetter, dt.Rows.Count 
+ 1);

                excelSheet.get_Range(excelRange, Type.Missing).Value2 
= rawData;

                
// Mark the first row as BOLD
                ((Range)excelSheet.Rows[1, Type.Missing]).Font.Bold = true;
            }

            
//excelApp.Application.AlertBeforeOverwriting = false;
            excelApp.Application.DisplayAlerts = false;
            
// Save and Close the Workbook
            excelWorkbook.SaveAs(outputPath, XlFileFormat.xlWorkbookNormal, Type.Missing,
                Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlExclusive,
                Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
            excelWorkbook.Close(
true, Type.Missing, Type.Missing);
            excelWorkbook 
= null;

            
// Release the Application object
            excelApp.Quit();
            excelApp 
= null;

            
// Collect the unreferenced objects
            GC.Collect();
            GC.WaitForPendingFinalizers();

        }

 

说明下,其中的  xlsApp.Application.DisplayAlerts   =   false;  的作用是不显示确认对话框    

也可以逐Cell读取,那样可能会慢。本方法速度还过得去。

生成Winform代码测试没错,部署时,以为只要引用两个dll就可以了

Microsoft.Office.Interop.Excel.dll

Office.dll


那成想,问题接着来了,当在WebForm下调用时, 提示“检索   COM   类工厂中   CLSID   为   {00024500-0000-0000-C000-000000000046}   的组件时失败,原因是出现以下错误:   8000401a

晕! Google下,解决方案是在服务器上安装Office,并配置DCOM权限。步骤如下:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
配置  DCOM  中  EXCEL  应用程序:
要在交互式用户帐户下设置  Office  自动化服务器,请按照下列步骤操作: 
1.  以管理员身份登录到计算机,并使用完整安装来安装(或重新安装)Office。为了实现系统的可靠性,建议您将  Office  CD-ROM  中的内容复制到本地驱动器并从此位置安装  Office。 
2.  启动要自动运行的  Office  应用程序。这会强制该应用程序进行自我注册。 
3.  运行该应用程序后,请按  Alt+F11  以加载  Microsoft  Visual  Basic  for  Applications  (VBA)  编辑器。这会强制  VBA  进行初始化。 
4.  关闭应用程序,包括  VBA。 
5.  单击开始,单击运行,然后键入  DCOMCNFG。选择要自动运行的应用程序。应用程序名称如下所示: 
Microsoft  Access  97  -  Microsoft  Access  数据库
Microsoft  Access  2000/2002  -  Microsoft  Access  应用程序
Microsoft  Excel  97/2000/2002  -  Microsoft  Excel  应用程序
Microsoft  Word  97  -  Microsoft  Word  Basic
Microsoft  Word  2000/2002  -  Microsoft  Word  文档 
单击属性打开此应用程序的属性对话框。
6.  单击安全选项卡。验证使用默认的访问权限和使用默认的启动权限已选中。 
7.  单击标识选项卡,然后选择交互式用户。 
8.  单击确定,关闭属性对话框并返回主应用程序列表对话框。 
9.  在  DCOM  配置对话框中,单击默认安全性选项卡。 
10.  单击访问权限的编辑默认值。验证访问权限中是否列出下列用户,如果没有列出,则添加这些用户: 
SYSTEM
INTERACTIVE
Everyone
Administrators
IUSR_ 
<machinename> *
IWAM_ 
<machinename> *
*  这些帐户仅在计算机上安装了  Internet  Information  Server  (IIS)  的情况下才存在。 
11.  确保允许每个用户访问,然后单击确定。 
12.  单击启动权限的编辑默认值。验证启动权限中是否列出下列用户,如果没有列出,则添加这些用户: 
SYSTEM
INTERACTIVE
Everyone
Administrators
IUSR_ 
<machinename> *
IWAM_ 
<machinename> *
*  这些帐户仅在计算机上安装有  IIS  的情况下才存在。 
13.  确保允许每个用户访问,然后单击确定。 
14.  单击确定关闭  DCOMCNFG。 
如果你之前起用了身份模拟  (在  web.config  中配置了  
<identity  impersonate= "true "/>  )  ,需要删除之! 
15.更新安装office,把.net可编程组件安装到本机(excel组件)
如果还是不行.干脃把交互式用户 换成"启动用户" 

 
折腾了一番,总算可以用了!·只是服务器上装Office总感觉不爽,于是再尝试下别的方法:

Reading and Writing Excel using OLEDB

主要的类文件如下:
ContractedBlock.gif ExpandedBlockStart.gif ExcelReaderClass
ExpandedBlockStart.gifContractedBlock.gif /**//// <summary>
    
/// Summary description for ExcelReader.
    
/// </summary>

    public class ExcelReader : IDisposable
ExpandedBlockStart.gifContractedBlock.gif    
{
ContractedSubBlock.gifExpandedSubBlockStart.gif        
Variables#region Variables
        
private int[] _PKCol;
        
private string _strExcelFilename;
        
private bool _blnMixedData = true;
        
private bool _blnHeaders = false;
        
private string _strSheetName;
        
private string _strSheetRange;
        
private bool _blnKeepConnectionOpen = false;
        
private OleDbConnection _oleConn;
        
private OleDbCommand _oleCmdSelect;
        
private OleDbCommand _oleCmdUpdate;
        
#endregion


ContractedSubBlock.gifExpandedSubBlockStart.gif        
properties#region properties

        
public int[] PKCols
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get return _PKCol; }
ExpandedSubBlockStart.gifContractedSubBlock.gif            
set { _PKCol = value; }
        }


        
public string ColName(int intCol)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
string sColName = "";
            
if (intCol < 26)
                sColName 
= Agronet.Common.Framework.Util.SQLParser.StringParse(Convert.ToChar((Convert.ToByte((char)'A'+ intCol)));
            
else
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
int intFirst = ((int)intCol / 26);
                
int intSecond = ((int)intCol % 26);
                sColName 
= Agronet.Common.Framework.Util.SQLParser.StringParse(Convert.ToByte((char)'A'+ intFirst);
                sColName 
+= Agronet.Common.Framework.Util.SQLParser.StringParse(Convert.ToByte((char)'A'+ intSecond);
            }

            
return sColName;
        }


        
public int ColNumber(string strCol)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            strCol 
= strCol.ToUpper();
            
int intColNumber = 0;
            
if (strCol.Length > 1)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                intColNumber 
= Agronet.Common.Framework.Util.SQLParser.ShortParse(Convert.ToByte(strCol[1]) - 65);
                intColNumber 
+= Agronet.Common.Framework.Util.SQLParser.ShortParse(Convert.ToByte(strCol[1]) - 64* 26;
            }

            
else
                intColNumber 
= Agronet.Common.Framework.Util.SQLParser.ShortParse(Convert.ToByte(strCol[0]) - 65);
            
return intColNumber;
        }




        
public String[] GetExcelSheetNames()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{

            System.Data.DataTable dt 
= null;

            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
if (_oleConn == null) Open();

                
// Get the data table containing the schema
                dt = _oleConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

ExpandedSubBlockStart.gifContractedSubBlock.gif                
if (dt == nullreturn null; }

                String[] excelSheets 
= new String[dt.Rows.Count];
                
int i = 0;

                
// Add the sheet name to the string array.
                foreach (DataRow row in dt.Rows)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    
string strSheetTableName = row["TABLE_NAME"].ToString();
                    excelSheets[i] 
= strSheetTableName.Substring(0, strSheetTableName.Length - 1);
                    i
++;
                }

                
return excelSheets;
            }

            
catch (Exception ex)//tony 2008.12.31 update
ExpandedSubBlockStart.gifContractedSubBlock.gif
            {
                
string s = ex.Message; return null;
            }

            
finally
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
// Clean up.
                if (this.KeepConnectionOpen == false)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    
this.Close();
                }

                
if (dt != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    dt.Dispose();
                    dt 
= null;
                }

            }

        }


        
public string ExcelFilename
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get return _strExcelFilename; }
ExpandedSubBlockStart.gifContractedSubBlock.gif            
set { _strExcelFilename = value; }
        }


        
public string SheetName
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get return _strSheetName; }
ExpandedSubBlockStart.gifContractedSubBlock.gif            
set { _strSheetName = value; }
        }


        
public string SheetRange
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get return _strSheetRange; }
            
set
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
if (value.IndexOf(":"== -1throw new Exception("Invalid range length");
                _strSheetRange 
= value;
            }

        }


        
public bool KeepConnectionOpen
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get return _blnKeepConnectionOpen; }
ExpandedSubBlockStart.gifContractedSubBlock.gif            
set { _blnKeepConnectionOpen = value; }
        }


        
public bool Headers
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get return _blnHeaders; }
ExpandedSubBlockStart.gifContractedSubBlock.gif            
set { _blnHeaders = value; }
        }


        
public bool MixedData
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
get return _blnMixedData; }
ExpandedSubBlockStart.gifContractedSubBlock.gif            
set { _blnMixedData = value; }
        }

        
#endregion


ContractedSubBlock.gifExpandedSubBlockStart.gif        
Methods#region Methods



ContractedSubBlock.gifExpandedSubBlockStart.gif        
Excel Connection#region Excel Connection
        
private string ExcelConnectionOptions()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
string strOpts = "";
            
if (this.MixedData == true)
                strOpts 
+= "Imex=1;";
            
if (this.Headers == true)
                strOpts 
+= "HDR=Yes;";
            
else
                strOpts 
+= "HDR=No;";
            
return strOpts;
        }




        
private string ExcelConnection()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
return
                
@"Provider=Microsoft.Jet.OLEDB.4.0;" +
                
@"Data Source=" + _strExcelFilename + ";" +
                
@"Extended Properties=" + Convert.ToChar(34).ToString() +
                
@"Excel 8.0;" + ExcelConnectionOptions() + Convert.ToChar(34).ToString();
        }

        
#endregion



ContractedSubBlock.gifExpandedSubBlockStart.gif        
Open / Close#region Open / Close
        
public void Open()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
if (_oleConn != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    
if (_oleConn.State == ConnectionState.Open)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
{
                        _oleConn.Close();
                    }

                    _oleConn 
= null;
                }


                
if (System.IO.File.Exists(_strExcelFilename) == false)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    
throw new Exception("Excel file " + _strExcelFilename + "could not be found.");
                }

                _oleConn 
= new OleDbConnection(ExcelConnection());
                _oleConn.Open();
            }

            
catch (Exception ex)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
throw ex;
            }

        }


        
public void Close()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
if (_oleConn != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
if (_oleConn.State != ConnectionState.Closed)
                    _oleConn.Close();
                _oleConn.Dispose();
                _oleConn 
= null;
            }

        }

        
#endregion


ContractedSubBlock.gifExpandedSubBlockStart.gif        
Command Select#region Command Select
        
private bool SetSheetQuerySelect()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
if (_oleConn == null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    
throw new Exception("Connection is unassigned or closed.");
                }


                
if (_strSheetName.Length == 0)
                    
throw new Exception("Sheetname was not assigned.");
ExpandedSubBlockStart.gifContractedSubBlock.gif                
/**//*
                                string tmpStr=@"SELECT * FROM [" 
                                    + _strSheetName 
                                    + "$" + _strSheetRange
                                    + "]";
                
*/

                
//System.Windows.Forms.MessageBox.Show(tmpStr);

                
//if(_strSheetName.EndsWith("$")){_strSheetName=_strSheetName.TrimEnd('$');}
                _oleCmdSelect = new OleDbCommand(
                    
@"SELECT * FROM ["
                    
+ _strSheetName
                    
+ "$" //+ _strSheetRange
                    + "]", _oleConn);
                
//me

                
return true;
            }

            
catch (Exception ex)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
throw ex;
            }



        }

        
#endregion


ContractedSubBlock.gifExpandedSubBlockStart.gif        
simple utilities#region simple utilities
        
private string AddWithComma(string strSource, string strAdd)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
if (strSource != "") strSource = strSource += "";
            
return strSource + strAdd;
        }


        
private string AddWithAnd(string strSource, string strAdd)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
if (strSource != "") strSource = strSource += " and ";
            
return strSource + strAdd;
        }

        
#endregion


        
private OleDbDataAdapter SetSheetQueryAdapter(DataTable dt)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
// Deleting in Excel workbook is not possible
            
//So this command is not defined
            try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{

                
if (_oleConn == null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    
throw new Exception("Connection is unassigned or closed.");
                }



                
if (_strSheetName.Length == 0)
                    
throw new Exception("Sheetname was not assigned.");

                
if (PKCols == null)
                    
throw new Exception("Cannot update excel sheet with no primarykey set.");
                
if (PKCols.Length < 1)
                    
throw new Exception("Cannot update excel sheet with no primarykey set.");

                OleDbDataAdapter oleda 
= new OleDbDataAdapter(_oleCmdSelect);
                
string strUpdate = "";
                
string strInsertPar = "";
                
string strInsert = "";
                
string strWhere = "";


                
for (int iPK = 0; iPK < PKCols.Length; iPK++)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    strWhere 
= AddWithAnd(strWhere, dt.Columns[iPK].ColumnName + "=?");
                }

                strWhere 
= " Where " + strWhere;

                
for (int iCol = 0; iCol < dt.Columns.Count; iCol++)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    strInsert 
= AddWithComma(strInsert, dt.Columns[iCol].ColumnName);
                    strInsertPar 
= AddWithComma(strInsertPar, "?");
                    strUpdate 
= AddWithComma(strUpdate, dt.Columns[iCol].ColumnName) + "=?";
                }


                
string strTable = "[" + this.SheetName + "$" + this.SheetRange + "]";
                strInsert 
= "INSERT INTO " + strTable + "(" + strInsert + ") Values (" + strInsertPar + ")";
                strUpdate 
= "Update " + strTable + " Set " + strUpdate + strWhere;


                oleda.InsertCommand 
= new OleDbCommand(strInsert, _oleConn);
                oleda.UpdateCommand 
= new OleDbCommand(strUpdate, _oleConn);
                OleDbParameter oleParIns 
= null;
                OleDbParameter oleParUpd 
= null;
                
for (int iCol = 0; iCol < dt.Columns.Count; iCol++)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    oleParIns 
= new OleDbParameter("?", dt.Columns[iCol].DataType.ToString());
                    oleParUpd 
= new OleDbParameter("?", dt.Columns[iCol].DataType.ToString());
                    oleParIns.SourceColumn 
= dt.Columns[iCol].ColumnName;
                    oleParUpd.SourceColumn 
= dt.Columns[iCol].ColumnName;
                    oleda.InsertCommand.Parameters.Add(oleParIns);
                    oleda.UpdateCommand.Parameters.Add(oleParUpd);
                    oleParIns 
= null;
                    oleParUpd 
= null;
                }


                
for (int iPK = 0; iPK < PKCols.Length; iPK++)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    oleParUpd 
= new OleDbParameter("?", dt.Columns[iPK].DataType.ToString());
                    oleParUpd.SourceColumn 
= dt.Columns[iPK].ColumnName;
                    oleParUpd.SourceVersion 
= DataRowVersion.Original;
                    oleda.UpdateCommand.Parameters.Add(oleParUpd);
                }

                
return oleda;
            }

            
catch (Exception ex)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
throw ex;
            }


        }


ContractedSubBlock.gifExpandedSubBlockStart.gif        
command Singe Value Update#region command Singe Value Update
        
private bool SetSheetQuerySingelValUpdate(string strVal)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
if (_oleConn == null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    
throw new Exception("Connection is unassigned or closed.");
                }


                
if (_strSheetName.Length == 0)
                    
throw new Exception("Sheetname was not assigned.");

                _oleCmdUpdate 
= new OleDbCommand(
                    
@" Update ["
                    
+ _strSheetName
                    
+ "$" + _strSheetRange
                    
+ "] set F1=" + strVal, _oleConn);
                
return true;
            }

            
catch (Exception ex)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
throw ex;
            }



        }

        
#endregion




        
public void SetPrimaryKey(int intCol)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
ExpandedSubBlockStart.gifContractedSubBlock.gif            _PKCol 
= new int[1{ intCol };
        }


        
public DataTable GetTable()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
return GetTable("ExcelTable");
        }


        
private void SetPrimaryKey(DataTable dt)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
if (PKCols != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    
//set the primary key
                    if (PKCols.Length > 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
{
                        DataColumn[] dc;
                        dc 
= new DataColumn[PKCols.Length];
                        
for (int i = 0; i < PKCols.Length; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif                        
{
                            dc[i] 
= dt.Columns[PKCols[i]];
                        }



                        dt.PrimaryKey 
= dc;

                    }

                }

            }

            
catch (Exception ex)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
throw ex;
            }

        }


        
public DataTable GetTable(string strTableName)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
//Open and query
               if (_oleConn == null)  Open();
                
if (_oleConn.State != ConnectionState.Open)
                    
throw new Exception("Connection cannot open error.");
                
if (SetSheetQuerySelect() == falsereturn null;

                
//Fill table
                OleDbDataAdapter oleAdapter = new OleDbDataAdapter();
                oleAdapter.SelectCommand 
= _oleCmdSelect;
                DataTable dt 
= new DataTable(strTableName);
                oleAdapter.FillSchema(dt, SchemaType.Source);
                oleAdapter.Fill(dt);
                
if (this.Headers == false)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    
if (_strSheetRange.IndexOf(":"> 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
{
                        
string FirstCol = _strSheetRange.Substring(0, _strSheetRange.IndexOf(":"- 1);
                        
int intCol = this.ColNumber(FirstCol);
                        
for (int intI = 0; intI < dt.Columns.Count; intI++)
ExpandedSubBlockStart.gifContractedSubBlock.gif                        
{
                            dt.Columns[intI].Caption 
= ColName(intCol + intI);
                        }

                    }

                }

                SetPrimaryKey(dt);
                
//Cannot delete rows in Excel workbook
                dt.DefaultView.AllowDelete = false;

                
//Clean up
                _oleCmdSelect.Dispose();
                _oleCmdSelect 
= null;
                oleAdapter.Dispose();
                oleAdapter 
= null;
                
if (KeepConnectionOpen == false) Close();
                
return dt;

            }

            
catch (Exception ex)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
throw ex;
            }

        }



        
private void CheckPKExists(DataTable dt)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
if (dt.PrimaryKey.Length == 0)
                
if (this.PKCols != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    SetPrimaryKey(dt);
                }

                
else
                    
throw new Exception("Provide an primary key to the datatable");
        }

        
public DataTable SetTable(DataTable dt)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                DataTable dtChanges 
= dt.GetChanges();
                
if (dtChanges == nullthrow new Exception("There are no changes to be saved!");
                CheckPKExists(dt);
                
//Open and query
                if (_oleConn == null) Open();
                
if (_oleConn.State != ConnectionState.Open)
                    
throw new Exception("Connection cannot open error.");
                
if (SetSheetQuerySelect() == falsereturn null;

                
//Fill table
                OleDbDataAdapter oleAdapter = SetSheetQueryAdapter(dtChanges);

                oleAdapter.Update(dtChanges);
                
//Clean up
                _oleCmdSelect.Dispose();
                _oleCmdSelect 
= null;
                oleAdapter.Dispose();
                oleAdapter 
= null;
                
if (KeepConnectionOpen == false) Close();
                
return dt;
            }

            
catch (Exception ex)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
throw ex;
            }

        }


ContractedSubBlock.gifExpandedSubBlockStart.gif        
Get/Set Single Value#region Get/Set Single Value

        
public void SetSingleCellRange(string strCell)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            _strSheetRange 
= strCell + ":" + strCell;
        }


        
public object GetValue(string strCell)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            SetSingleCellRange(strCell);
            
object objValue = null;
            
//Open and query
            if (_oleConn == null) Open();
            
if (_oleConn.State != ConnectionState.Open)
                
throw new Exception("Connection is not open error.");

            
if (SetSheetQuerySelect() == falsereturn null;
            objValue 
= _oleCmdSelect.ExecuteScalar();

            _oleCmdSelect.Dispose();
            _oleCmdSelect 
= null;
            
if (KeepConnectionOpen == false) Close();
            
return objValue;
        }


        
public void SetValue(string strCell, object objValue)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{

            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{

                SetSingleCellRange(strCell);
                
//Open and query
                if (_oleConn == null) Open();
                
if (_oleConn.State != ConnectionState.Open)
                    
throw new Exception("Connection is not open error.");

                
if (SetSheetQuerySingelValUpdate(objValue.ToString()) == falsereturn;
                objValue 
= _oleCmdUpdate.ExecuteNonQuery();

                _oleCmdUpdate.Dispose();
                _oleCmdUpdate 
= null;
                
if (KeepConnectionOpen == false) Close();
            }

            
catch (Exception ex)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
throw ex;
            }

            
finally
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
if (_oleCmdUpdate != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    _oleCmdUpdate.Dispose();
                    _oleCmdUpdate 
= null;
                }

            }


        }

        
#endregion



        
#endregion


        
public

ContractedSubBlock.gifExpandedSubBlockStart.gif        
Dispose / Destructor#region Dispose / Destructor
 
void Dispose()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
if (_oleConn != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                _oleConn.Dispose();
                _oleConn 
= null;
            }

            
if (_oleCmdSelect != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                _oleCmdSelect.Dispose();
                _oleCmdSelect 
= null;
            }

            
// Dispose of remaining objects.
        }

        
#endregion


ContractedSubBlock.gifExpandedSubBlockStart.gif        
CTOR#region CTOR
        
public ExcelReader()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
//
            
// TODO: Add constructor logic here
            
//
        }

        
#endregion

    }

思路:通过读出Excel模板文件到DataTale,再把数据填充到DataTable,文件另存下就OK了!

 调用代码如下:

ContractedBlock.gif ExpandedBlockStart.gif DataSetToLocalExcel
 public static string path = @"TempExcel\STemp.xls";
        
public static string path2 = "TestUser.xls";
        
public static string PreFilePath = @"C:\Excel\";
        
public static void DataSetToLocalExcel(DataSet ds, string srcPath, string outputPath, bool deleteOldFile)
ExpandedBlockStart.gifContractedBlock.gif        
{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
if (ds == null || ds.Tables[0== null && ds.Tables[0].Rows.Count == 0return; }
            
if (deleteOldFile)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
ExpandedSubBlockStart.gifContractedSubBlock.gif                
if (System.IO.File.Exists(outputPath)) { System.IO.File.Delete(outputPath); }
            }

            System.IO.File.Copy(srcPath, outputPath, 
true);
            ExcelReader exr 
= new ExcelReader();
            exr.ExcelFilename 
= outputPath;
            exr.Headers 
= true;
            exr.MixedData 
= true;
            exr.KeepConnectionOpen 
= true;
            
string[] sheetnames = exr.GetExcelSheetNames();
            exr.SheetName 
= sheetnames[0];
            DataTable dt 
= exr.GetTable();
            
if (dt == nullreturn;
            exr.SetPrimaryKey(
0);
            
//dt.PrimaryKey = new DataColumn[] { dt.Columns["编号"] };
            DataTable dt2 = ds.Tables[0].Copy();
            dt.Rows.Clear();
            
for (int i = 0; i < dt2.Rows.Count; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
// Copy the values to the object array
                DataRow dr = dt.NewRow();
                
for (int col = 0; col < dt.Columns.Count; col++)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    dr[col] 
= dt2.Rows[i][col];
                }

                dt.Rows.Add(dr);
            }

            exr.SetTable(dt);
ContractedSubBlock.gifExpandedSubBlockStart.gif            
WriteFile#region WriteFile
           
            
#endregion

            exr.Close();
            exr.Dispose();
            exr 
= null;
        }

        
private DataSet Get_AllPrices()
ExpandedBlockStart.gifContractedBlock.gif        
{
            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
// Get the employee details
                string strSql = "SELECT [CustomID] as 编号,[C_Name] as 品名,0 as 最高价格,0 as 最低价格,0 as 平均价格,'元/公斤' as 计量单位,'' as 备注  FROM [PriceCategory] WHERE ( 1=1 AND ([Puser] = 'tuser') )";
                SqlConnection objConn 
= new SqlConnection(@"Data Source=AP6;Initial Catalog=testdb2009 ;Persist Security Info=True;User ID=sa;Password=sa");
                SqlDataAdapter daEmp 
= new SqlDataAdapter(strSql, objConn);
                daEmp.Fill(dsPrice, 
"price");
                
return dsPrice;
            }

            
catch (Exception Ex)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
throw Ex;
            }

        }


        DataSet dsPrice 
= new DataSet();
        
protected void btnGetData_Click(object sender, EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif        
{
            DataSetToLocalExcel(Get_AllPrices(), PreFilePath 
+ path, PreFilePath + path2, true);
        }

 

这里有点强调下:OleDbConnection特别要注意, 刚开始用http://www.connectionstrings.com/excel

  提供的标准串:

 

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:"MyExcel.xls;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1";

结果提示:“操作必须使用一个可更新的查询”。因为读取结果正常,以为是excel没有写权限所致,增加了相应权限后,结果依然如故。这下火了! Google下, 有解决方案

http://www.cnblogs.com/richinger/archive/2008/09/28/1301170.html

A: HDR ( HeaDer Row )设置
    若指定值为Yes,代表 Excel 档中的工作表第一行是栏位名称

    若指定值為 No,代表 Excel 档中的工作表第一行就是資料了,沒有栏位名称

    B:IMEX ( IMport EXport mode )设置

     IMEX 有三种模式,各自引起的读写行为也不同,容後再述:
     0 is Export mode
     1 is Import mode
     2 is Linked mode (full update capabilities)

    

于是修改为:

ContractedBlock.gif ExpandedBlockStart.gif Code
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:"MyExcel.xls;Extended Properties="Excel 8.0;HDR=Yes;IMEX=2";

 附上两个方法:StringParse和ShortParse

ExpandedBlockStart.gif 代码
   #region  String

        
public   static   string  EmptyString  =   string .Empty;
        
public   static   string  StringParse( string  old)
        { 
return  StringParse(old,  string .Empty); }
        
public   static   string  StringParse( object  old)
        { 
return  StringParse(old,  string .Empty); }
        
public   static   string  StringParse( object  old,  string  ReplaceString)
        {
            
if  (old  ==   null   ||  old.ToString().Trim().Length  ==   0 )
            {
                
if  (ReplaceString  ==   null   ||  ReplaceString.Trim().Length  ==   0 ) {  return   string .Empty; }
                
else  {  return  ReplaceString.Trim(); }
            }
            
else  {  return  old.ToString().Trim(); }
        }
        
public   static   string  StringParse( string  old,  string  ReplaceString)
        {
            
if  (old  ==   null   ||  old.Trim().Length  ==   0 )
            {
                
if  (ReplaceString  ==   null   ||  ReplaceString.Trim().Length  ==   0 ) {  return   string .Empty; }
                
else  {  return  ReplaceString.Trim(); }
            }
            
else  {  return  old.Trim(); }
        }
        
#endregion

 
#region  Short
        
public   static   short  ShortParse( string  old)
        { 
return  ShortParse(old,  0 ); }
        
public   static   short  ShortParse( object  old)
        { 
return  ShortParse(old,  0 ); }
        
public   static   short  ShortParse( string  old,  short  NullValue)
        {
            
short  i  =   0 ;
            
try
            {
                
if  (old  !=   null   &&  old.ToString().IndexOf( ' . ' >   0 )
                {
                    
string  str  =  old.ToString().Remove(old.ToString().IndexOf( ' . ' ));
                    i 
=   short .Parse(str.Trim());
                }
                
else  { i  =   short .Parse(old.ToString().Trim()); }

            }
            
catch  {  try  { i  =  NullValue; }  catch  { i  =  ( short ) 0 ; } }
            
return  i;
        }
        
public   static   short  ShortParse( object  old,  short  NullValue)
        {
            
short  i  =   0 ;
            
try
            {
                
if  (old  !=   null   &&  old.ToString().IndexOf( ' . ' >   0 )
                {
                    
string  str  =  old.ToString().Remove(old.ToString().IndexOf( ' . ' ));
                    i 
=   short .Parse(str.Trim());
                }
                
else  { i  =   short .Parse(old.ToString().Trim()); }
            }
            
catch  {  try  { i  =  NullValue; }  catch  { i  =  ( short ) 0 ; } }
            
return  i;
        }
        
public   static   short  ShortTryParse( object  srcObj)
        {
            
short  defaultValue;
            
if  (srcObj  ==   null ) {  return   0 ; }
            Int16.TryParse(srcObj.ToString(), 
out  defaultValue);
            
return  defaultValue;
        }
        
public   static   short  ShortTryParse( object  srcObj,  short  NullValue)
        {
            
short  defaultValue;
            
/// /if (srcObj == null) { return 0; }
            Int16.TryParse(srcObj.ToString(),  out  defaultValue);
            
if  ( ! Int16.TryParse(srcObj.ToString(),  out  defaultValue)) { Int16.TryParse(NullValue.ToString(),  out  defaultValue); }
            
return  defaultValue;
        }
        
#endregion
 

转载于:https://www.cnblogs.com/downmoon/archive/2009/01/16/1376702.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值