博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DataSet导出到Excel比较完整的解决方案(二)--服务器端生成文件(downmoon)
阅读量:5941 次
发布时间:2019-06-19

本文共 20780 字,大约阅读时间需要 69 分钟。

在中,介绍了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总感觉不爽,于是再尝试下别的方法:

主要的类文件如下:
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特别要注意, 刚开始用

  提供的标准串:

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

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

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
 
邀月注:本文版权由邀月和博客园共同所有,转载请注明出处。
助人等于自助!  
你可能感兴趣的文章
Linux 爱好者的飞行棋:sudo
查看>>
ONOS项目首赢11000次下载 Oracle发布云路由
查看>>
大数据的六大人工智能变现方式
查看>>
云计算的三个应用实例
查看>>
DEF CON 专题 | 溜门撬锁,暗黑市集,带你看世界最大的黑客狂欢
查看>>
新东家要哭了,雅虎终于承认上亿用户数据被盗
查看>>
OPM攻击事件后:我们从中学到了什么?
查看>>
大数据、机器学习与深度学习类命令行工具汇总
查看>>
闪存普及推动技术进步!2016年存储行业五大热门技术回顾
查看>>
构建私有云的五个步骤
查看>>
视频直播营销时代已来,企业该如何把握这波红利?
查看>>
BEC攻击危害惊人 3年造成23亿美元损失
查看>>
错过CVPR 2017?绝对不能错过GAIR大讲堂——上海交大专场开启报名
查看>>
云服务器 ECS快速入门:远程连接 ECS 实例
查看>>
《C++语言入门经典》一2.8 左值与右值
查看>>
2017年安防监控中的那些核心云计算技术
查看>>
中国在科技领域崛起 美国人的保护主义蠢蠢欲动
查看>>
科大讯飞陶晓东:人工智能时代的医学影像 | CCF-GAIR 2017
查看>>
服务器市场步步为营:Intel发布新款至强Xeon E5-4600v4四路处理器
查看>>
智能合约不够安全?微软建专项小组从编程语言入手根治
查看>>