DataTable中存在空值 输出到EXCEL时格式变乱的解决方法【附代码】

      当我们输出到EXCEL的值中有 空字符串的时候,由于输出时格式并不确定,因此系统会为空字符串自动输出成一个 ’(单引号),这样输出后的格式就会乱掉,采取一种简单的做法后可以解决。

    输出的时候将所有空值 和空字符串 都转成 "  " 空格字符串,于是格式乱的问题都解决了。

     附: E8提供BaseTools中的关于EXCEL 输出的 代码:

 

    

ContractedBlock.gif ExpandedBlockStart.gif ExportExcel.cs
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Data.OleDb;

namespace Epower.DevBase.BaseTools
ExpandedBlockStart.gifContractedBlock.gif
{

ExpandedSubBlockStart.gifContractedSubBlock.gif    
/**//// <summary>
    
/// 
    
/// </summary>

    public class IDataFieldProcess
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
        
/// 
        
/// </summary>

        public IDataFieldProcess()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
//
            
// TODO: 在此处添加构造函数逻辑
            
//
        }

ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
        
///  处理字段结果
        
/// </summary>
        
/// <param name="lngID"></param>
        
/// <param name="lngAppID"></param>
        
/// <param name="lngOpID"></param>
        
/// <returns></returns>

        public virtual string GetDataFieldProcess(string sFieldValue, string sPara)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
return sFieldValue;
        }

    }


ExpandedSubBlockStart.gifContractedSubBlock.gif    
/**//// <summary>
    
/// ExcelProc 的摘要说明。
    
/// </summary>

    public class ExportExcel
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
private static OleDbConnection _oleConn;
        
private static OleDbCommand _oleCmdSelect;
        
public ExportExcel()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
//
            
// TODO: 在此处添加构造函数逻辑
            
//
        }


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


        
private static OleDbDataAdapter SetSheetQueryAdapter(DataTable dt)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
// Deleting in Excel workbook is not possible
            
//So this command is not defined
            try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                    
                OleDbDataAdapter oleda 
= new OleDbDataAdapter(_oleCmdSelect); 
                
string strInsertPar="";
                
string strInsert="";
                
                

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


                
string strTable = "[Sheet1$]";  
                strInsert 
= "INSERT INTO "+ strTable + "(" + strInsert +") Values (" + strInsertPar + ")";
                oleda.InsertCommand 
= new OleDbCommand(strInsert,_oleConn);                
                OleDbParameter oleParIns 
= null;                
                
for (int iCol=0;iCol<dt.Columns.Count;iCol++)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    oleParIns 
= new OleDbParameter("?",dt.Columns[iCol].DataType.ToString());
                    
                    oleParIns.SourceColumn 
=dt.Columns[iCol].ColumnName;
                    
                    oleda.InsertCommand.Parameters.Add(oleParIns);
                    
                    oleParIns
=null;                    
                }

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

            
        }


ExpandedSubBlockStart.gifContractedSubBlock.gif       
/**//// <summary>
       
/// 
       
/// </summary>
       
/// <param name="tmpFileName">源文件</param>
       
/// <param name="toFileName">目标文件</param>
       
/// <param name="arrFields">字段数组</param>
       
/// <param name="dtSource">源数据</param>

        public static void InsertExcel(string tmpFileName,string toFileName,string[] arrFields,System.Data.DataTable dtSource,IDataFieldProcess idfp)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{            
            
string Tablename = "[Sheet1$]";
            System.IO.File.Copy(tmpFileName,toFileName,
true);

            System.IO.FileInfo fi
=new System.IO.FileInfo(toFileName);
            fi.Attributes
=System.IO.FileAttributes.Normal;

            
string strCon = @" Provider = Microsoft.Jet.OLEDB.4.0;Data Source= " + toFileName + ";Extended Properties=Excel 8.0";
            _oleConn 
= new OleDbConnection ( strCon ) ;
            
string strCom = " SELECT * FROM  "+ Tablename+" WHERE 1=2";
            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                _oleConn.Open () ;
                
//打开数据链接,得到一个数据集
                _oleCmdSelect =new OleDbCommand(strCom, _oleConn); 
                OleDbDataAdapter myCommand 
= new OleDbDataAdapter ( strCom , _oleConn);

                OleDbCommandBuilder cb
=new OleDbCommandBuilder(myCommand);
                
//创建一个 DataTable对象
                DataTable myDT = new DataTable (Tablename) ;
                
//得到自己的DataSet对象
                myCommand.Fill(myDT) ; 
                
foreach(DataRow drSource in dtSource.Rows)    
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    DataRow dr 
= myDT.NewRow();
                    
for(int n=0;n<arrFields.Length;n++)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
{
                        
string sFileName=arrFields[n].ToString();
                        
string sValue = "";

                        
if (sFileName.IndexOf(":"> 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif                        
{
                            
//如果字段名内有: 分开,则经过 一次处理后输出
                            string[] sArr = sFileName.Split(":".ToCharArray());
                            sValue 
= idfp.GetDataFieldProcess(drSource[sArr[0]].ToString(), sArr[1]);
                        }

                        
else
ExpandedSubBlockStart.gifContractedSubBlock.gif                        
{
                            sValue 
= drSource[sFileName].ToString();
                        }

                        
//防止空值打乱格式
                        if (sValue == "")
ExpandedSubBlockStart.gifContractedSubBlock.gif                        
{
                            sValue 
= " ";
                        }

                        dr[n] 
= (object)sValue;

                    }

                    myDT.Rows.InsertAt(dr,
0);
                }

                OleDbDataAdapter oleAdapter 
= SetSheetQueryAdapter(myDT);        
                
                oleAdapter.Update(myDT); 
                                  
            }

            
catch(Exception er)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
throw new Exception(er.Message);
            }

            
finally
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                _oleConn.Close () ;                 
            }

            
        }

    }

}

 

 

    ExportExcel.cs 里面 就有专门的处理这个情况。E8.Net用户可以直接参考这个代码进行修正

    其中 IDataFieldProcess  主要是为了处理输出EXCEL时 一些字段需要转换的情况(如:状态名称等),如果全在SQL SERVER进行转换会加大 SQLSERVER的压力

 

  

转载于:https://www.cnblogs.com/cancanwyq/archive/2009/05/21/1486574.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用以下代码DataTable 的数据保存到 Excel 文件: ```vb Imports System.Data.OleDb Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load SaveDataTableToExcel() End Sub Private Sub SaveDataTableToExcel() ' 创建 DataTable 并填充数据 Dim dataTable As New DataTable() dataTable.Columns.Add("ColumnA") dataTable.Columns.Add("ColumnB") dataTable.Rows.Add("ValueA1", "ValueB1") dataTable.Rows.Add("ValueA2", "ValueB2") dataTable.Rows.Add("ValueA3", "ValueB3") ' 设置连接字符串 Dim connString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\your_excel_file.xlsx;Extended Properties='Excel 12.0 Xml;HDR=YES;'" ' 创建连接对象 Using conn As New OleDbConnection(connString) conn.Open() ' 创建插入数据的 SQL 命令 Dim insertSQL As String = "INSERT INTO [Sheet1$] (ColumnA, ColumnB) VALUES (?, ?)" ' 创建插入数据的命令对象 Using insertCmd As New OleDbCommand(insertSQL, conn) insertCmd.Parameters.Add("@ColumnA", OleDbType.VarChar) insertCmd.Parameters.Add("@ColumnB", OleDbType.VarChar) ' 遍历 DataTable 的行并插入到 Excel For Each row As DataRow In dataTable.Rows insertCmd.Parameters("@ColumnA").Value = row("ColumnA").ToString() insertCmd.Parameters("@ColumnB").Value = row("ColumnB").ToString() insertCmd.ExecuteNonQuery() Next End Using End Using End Sub End Class ``` 请确保将 `your_excel_file.xlsx` 替换为您要保存的实际 Excel 文件的路径。此示例假设您正在使用 Excel 2007 或更高版本。 这段代码在 `Form1_Load` 事件调用 `SaveDataTableToExcel` 方法,该方法创建一个 DataTable 并填充一些示例数据。然后,它使用 OleDb 连接到指定的 Excel 文件,并将 DataTable 的数据插入到名为 "Sheet1" 的工作表的相应列。 希望对您有所帮助!如有更多问题,请随提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值