4

c#如何读取excel文件

by 刘武 7. 七月 2010 20:11

使用OLEDB可以对excel文件进行读取,我们只要把该excel文件作为数据源即可。

一 在D盘创建excel文件test.xls:

二 将工作表Sheet1的内容读取到DataSet

string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/test.xls;"+
    "Extended Properties='Excel 8.0'";
DataSet ds = new DataSet();
OleDbDataAdapter oada = new OleDbDataAdapter("select * from [Sheet1$]", strConn);
oada.Fill(ds);

读取的DataSet为:

从图中可以看出excel文件中的第一行变成了DataSet中的列名,这正是系统的默认设置。

三 如果想把第一行也作为数据行,那我们可以给连接字符串添加一个HDR=No属性

如:

string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/test.xls;"+
    "Extended Properties='Excel 8.0;HDR=No'";
DataSet ds = new DataSet();
OleDbDataAdapter oada = new OleDbDataAdapter("select * from [Sheet1$]", strConn);
oada.Fill(ds);
结果也许会让你有点想不到:

第一行的第一列和第三列都变成空的了,这是因为系统把第一列识别成了数字,把第三列识别成了日期,而第一行的数据不符合格式的要求,所以就变成空的了。

四 我们还可以把所有列都做为字符串来读取,只要添加属性IMEX=1即可

string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/test.xls;"+
    "Extended Properties='Excel 8.0;HDR=No;IMEX=1'";
DataSet ds = new DataSet();
OleDbDataAdapter oada = new OleDbDataAdapter("select * from [Sheet1$]", strConn);
oada.Fill(ds);
结果又会如何呢?

是不是再次出乎你的意料,第三行的日期怎么变成数字了,其实excel在转换格式的时候就自动把日期变成数字了,那这个数字是怎么来的呢 ? 如果你把日期改成1900年1月1日,那么你可以看到他的转换结果是1,以此类推,39902是哪一天就明白了吧。

五 也许你并不想读取整个excel的内容

如果只想读取前两列可以用:select * from [Sheet1$A:B]

如果只想读取A1到B2的内容,就用:select * from [Sheet1$A1:B2]

六 如果不知道工作表的名字或名字被人为修改了该怎么办呢?

我们可以通过索引来获取指定工作表的名字,以下方法可以用来获取工作表名称的数组:

ArrayList al = new ArrayList();
string strConn;
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/test.xls;"+
    "Extended Properties=Excel 8.0;";
OleDbConnection conn = new OleDbConnection(strConn);
conn.Open();
DataTable sheetNames = conn.GetOleDbSchemaTable
    (OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
conn.Close();
foreach (DataRow dr in sheetNames.Rows)
{
    al.Add(dr[2]);
}
return al;

 

2010年7月7日 修正:

IMEX=1的时候并不是全都会作为字符串来处理,根据系统的默认设置,通常如果前8行有字符串,则该列会作为字符串来处理,如果全都为数字,则该列为数字列,日期也是一样。

如果你觉得8行不够或者太多了,则只能修改注册表HKEY_LOCAL_MACHINE/Software/Microsoft/Jet/4.0/Engines/Excel/TypeGuessRows,如果此值为0,则会根据所有行来判断使用什么类型,通常不建议这麽做,除非你的数据量确实比较少。

Tags: , ,

技术生涯

0

如何将类库里Web服务配置节的内容移到主程序中

by 刘武 18. 六月 2009 21:12

项目中需要在数据访问层中添加Web引用,因此系统会在该类库中自动生成一个APP.CONFIG文件,里面包含了Web服务的地址。可惜的是,如果在主程序中添加对该类库的引用,系统并不会帮你生成该类库的配置节,那么如何在主程序中配置类库中的内容呢? 其实很简单,只要将类库的APP.CONFIG中的相关内容复制到主程序中即可。如以下是数据访问层DataAccess的APP.CONFIG文件中的内容:


<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
      <section name="DataAccess.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
  </configSections>
  <applicationSettings>
    <DataAccess.Properties.Settings>
      <setting name="DataAccess_Liuwu_Net_WebService" serializeAs="String">
        <value>http://liuwu.net:9823/AJAXEnabledWebSite1/WebService.asmx</value>
      </setting>
    </DataAccess.Properties.Settings>
  </applicationSettings>
</configuration>

我们只要将其中的sectionGroup和applicationSettings的内容复制到主程序的APP.CONFIG文件中即可,以下是主程序的APP.CONFIG:


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
      <section name="DataAccess.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
  </configSections>
  <applicationSettings>
    <DataAccess.Properties.Settings>
      <setting name="DataAccess_Liuwu_Net_WebService" serializeAs="String">
        <value>http://liuwu.net:9823/AJAXEnabledWebSite1/WebService.asmx</value>
      </setting>
    </DataAccess.Properties.Settings>
  </applicationSettings>
  <appSettings>
    <add key="Hello" value="1234"/>
  </appSettings>
</configuration>

同理,如果还有其他类似的项目,只要将相关的配额节追加到主程序的APP.CONFIG文件中即可。

Tags: ,

技术生涯

0

怎么获取汉字的拼音缩写

by 刘武 2. 三月 2009 23:36

在google里找到这个方法,还挺实用的,特意收藏,以备以后查看:

/// <summary>
/// 获取中文拼音缩写
/// </summary>
/// <param name="strInput">输入的中文</param>
/// <returns>拼音缩写</returns>


public static string GetPYForShort(string strInput)
{
    string result = "";
    foreach (char c in strInput)
    {
        if ((int)c >= 33 && (int)c <= 126)
        {
            //保留字母和符号
            result += c.ToString();
        }
        else
        {
            result += GetPYChar(c.ToString());
        }
    }
    return result;
}

/// <summary>
/// 取单个字符的拼音声母
/// </summary>
/// <param name="c">要转换的单个汉字</param>
/// <returns>拼音声母</returns>


private static string GetPYChar(string cInput)
{
    byte[] array = new byte[2];
    array = System.Text.Encoding.Default.GetBytes(cInput);
    int i = (short)(array[0] - '\0') * 256 + ((short)(array[1] - '\0'));

    if (i < 0xB0A1) return "*";
    if (i < 0xB0C5) return "a";
    if (i < 0xB2C1) return "b";
    if (i < 0xB4EE) return "c";
    if (i < 0xB6EA) return "d";
    if (i < 0xB7A2) return "e";
    if (i < 0xB8C1) return "f";
    if (i < 0xB9FE) return "g";
    if (i < 0xBBF7) return "h";
    if (i < 0xBFA6) return "g";
    if (i < 0xC0AC) return "k";
    if (i < 0xC2E8) return "l";
    if (i < 0xC4C3) return "m";
    if (i < 0xC5B6) return "n";
    if (i < 0xC5BE) return "o";
    if (i < 0xC6DA) return "p";
    if (i < 0xC8BB) return "q";
    if (i < 0xC8F6) return "r";
    if (i < 0xCBFA) return "s";
    if (i < 0xCDDA) return "t";
    if (i < 0xCEF4) return "w";
    if (i < 0xD1B9) return "x";
    if (i < 0xD4D1) return "y";
    if (i < 0xD7FA) return "z";

    return "*";
}

Tags: ,

技术生涯

1

ASP.NET 如何导出excel(二)

by 刘武 19. 一月 2009 22:43

在上一篇 ASP.NET 如何导出excel(一)中介绍了导出html格式的excel文件的方法。本篇介绍另一种方法:导出xml格式的excel文件。该方法比上一种方法更具有通用性,功能也更强大,他可以导出多个工作表,并且支持各种样式以及常用的公式,不过也有缺点,就是不能包含图片以及图表。

一)确定要导出的excel文件的格式

我们可以先制作一个excel文件做为模板,他包含了要导出的格式,如:

然后选择 “文件”/ “另存为” 保存为xml表格,用记事本打开保存的xml文件,就可以看到他的内容了:


<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:o="urn:schemas-microsoft-com:office:office"
 xmlns:x="urn:schemas-microsoft-com:office:excel"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:html="http://www.w3.org/TR/REC-html40">
 <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
  <Created>1996-12-17T01:32:42Z</Created>
  <LastSaved>2009-01-19T15:35:16Z</LastSaved>
  <Version>11.5606</Version>
 </DocumentProperties>
 <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
  <RemovePersonalInformation/>
 </OfficeDocumentSettings>
 <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
  <WindowHeight>4530</WindowHeight>
  <WindowWidth>8505</WindowWidth>
  <WindowTopX>480</WindowTopX>
  <WindowTopY>120</WindowTopY>
  <AcceptLabelsInFormulas/>
  <ProtectStructure>False</ProtectStructure>
  <ProtectWindows>False</ProtectWindows>
 </ExcelWorkbook>
 <Styles>
  <Style ss:ID="Default" ss:Name="Normal">
   <Alignment ss:Vertical="Bottom"/>
   <Borders/>
   <Font ss:FontName="宋体" x:CharSet="134" ss:Size="12"/>
   <Interior/>
   <NumberFormat/>
   <Protection/>
  </Style>
  <Style ss:ID="s23">
   <NumberFormat ss:Format="yyyy/mm/dd"/>
  </Style>
  <Style ss:ID="s26">
   <Borders>
    <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
    <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
    <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
    <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
   </Borders>
   <Font ss:FontName="宋体" x:CharSet="134" ss:Size="12" ss:Bold="1"/>
   <Interior ss:Color="#99CCFF" ss:Pattern="Solid"/>
  </Style>
  <Style ss:ID="s27">
   <NumberFormat/>
  </Style>
 </Styles>
 <Worksheet ss:Name="Sheet1">
  <Table ss:ExpandedColumnCount="4" ss:ExpandedRowCount="3" x:FullColumns="1"
   x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25">
   <Column ss:AutoFitWidth="0" ss:Width="55.5"/>
   <Column ss:AutoFitWidth="0" ss:Width="87"/>
   <Column ss:AutoFitWidth="0" ss:Width="61.5"/>
   <Column ss:AutoFitWidth="0" ss:Width="87.75"/>
   <Row ss:AutoFitHeight="0" ss:Height="19.5">
    <Cell ss:StyleID="s26"><Data ss:Type="String">姓名</Data></Cell>
    <Cell ss:StyleID="s26"><Data ss:Type="String">出生日期</Data></Cell>
    <Cell ss:StyleID="s26"><Data ss:Type="String">年龄</Data></Cell>
    <Cell ss:StyleID="s26"><Data ss:Type="String">薪水</Data></Cell>
   </Row>
   <Row ss:AutoFitHeight="0" ss:Height="19.5">
    <Cell><Data ss:Type="String">刘武</Data></Cell>
    <Cell ss:StyleID="s23"><Data ss:Type="DateTime">1983-01-01T00:00:00.000</Data></Cell>
    <Cell ss:StyleID="s27"><Data ss:Type="Number">26</Data></Cell>
    <Cell><Data ss:Type="Number">5000</Data></Cell>
   </Row>
   <Row ss:AutoFitHeight="0" ss:Height="19.5">
    <Cell><Data ss:Type="String">刘文</Data></Cell>
    <Cell ss:StyleID="s23"><Data ss:Type="DateTime">1978-04-08T00:00:00.000</Data></Cell>
    <Cell ss:StyleID="s27"><Data ss:Type="Number">31</Data></Cell>
    <Cell><Data ss:Type="Number">8000</Data></Cell>
   </Row>
  </Table>
  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
   <Selected/>
   <Panes>
    <Pane>
     <Number>3</Number>
     <ActiveRow>7</ActiveRow>
     <ActiveCol>2</ActiveCol>
    </Pane>
   </Panes>
   <ProtectObjects>False</ProtectObjects>
   <ProtectScenarios>False</ProtectScenarios>
  </WorksheetOptions>
 </Worksheet>
 <Worksheet ss:Name="Sheet2">
  <Table ss:ExpandedColumnCount="0" ss:ExpandedRowCount="0" x:FullColumns="1"
   x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25"/>
  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
   <ProtectObjects>False</ProtectObjects>
   <ProtectScenarios>False</ProtectScenarios>
  </WorksheetOptions>
 </Worksheet>
 <Worksheet ss:Name="Sheet3">
  <Table ss:ExpandedColumnCount="0" ss:ExpandedRowCount="0" x:FullColumns="1"
   x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25"/>
  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
   <ProtectObjects>False</ProtectObjects>
   <ProtectScenarios>False</ProtectScenarios>
  </WorksheetOptions>
 </Worksheet>
</Workbook>
这是一个标准的xml文件,可以用excel打开,同时也支持open office。

二 根据模板的内容编写输出流

Response.AddHeader("Content-Disposition", "attachment;filename=" +
 HttpUtility.UrlEncode(DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls",
  System.Text.Encoding.UTF8));
Response.ContentEncoding = System.Text.Encoding.Default;
Response.ContentType = "application/ms-excel";
System.IO.StringWriter sw = new System.IO.StringWriter();
sw.WriteLine("<?xml version=\"1.0\"?>");
sw.WriteLine("<?mso-application progid=\"Excel.Sheet\"?>");
sw.WriteLine("<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"");
sw.WriteLine(" xmlns:o=\"urn:schemas-microsoft-com:office:office\"");
sw.WriteLine(" xmlns:x=\"urn:schemas-microsoft-com:office:excel\"");
sw.WriteLine(" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"");
sw.WriteLine(" xmlns:html=\"http://www.w3.org/TR/REC-html40\">");
sw.WriteLine("<Worksheet ss:Name=\"Sheet1\">");
// ........
sw.WriteLine("</Worksheet>");
sw.WriteLine("</Workbook>");
Response.Write(sw);
Response.End();

Tags: , ,

技术生涯

1

ASP.NET如何导出excel(一)

by 刘武 12. 一月 2009 20:32

ASP.NET中导出excel的方法很多,最简单的就是利用服务器控件的RenderControl方法,他可以把服务器控件的内容作为流输出到客户端,可以用该方法输出整个页面,也可以输出单独的控件。单必须注意使用该方法时必须重载 VerifyRenderingInServerForm 函数,否则就会出错。以下是参考代码:

DEMO.ASPX:


<asp:GridView ID="gv1" runat="server" AutoGenerateColumns="false">
 <Columns>
  <asp:BoundField DataField="Name" HeaderText="Name" />
  <asp:BoundField DataField="Date" HeaderText="Date"
   DataFormatString="{0:yyyy-MM-dd}" />
  <asp:BoundField DataField="Number" HeaderText="Number"
   DataFormatString="{0:#,###.00}" />
 </Columns>
</asp:GridView>
<asp:Button ID="btnExport" runat="server" Text="导出"
 OnClick="btnExport_Click" />

DEMO.ASPX.CS:

class Item
    {
        string _name;
        public string Name
        {
            set { _name = value; }
            get { return _name; }
        }

        DateTime _date;
        public DateTime Date
        {
            set { _date = value; }
            get { return _date; }
        }

        decimal _number;
        public decimal Number
        {
            set { _number = value; }
            get { return _number; }
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            #region  加载数据
            IList<Item> items = new List<Item>();
            Item i = new Item();
            i.Name = "liuwu";
            i.Date = DateTime.Now;
            i.Number = 1234567;
            items.Add(i);

            i = new Item();
            i.Name = "刘武";
            i.Date = DateTime.Now.AddDays(5);
            i.Number = 234.45m;
            items.Add(i);

            gv1.DataSource = items;
            gv1.DataBind();
            #endregion
        }
    }

    /// <summary>
    /// 导出excel
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnExport_Click(object sender, EventArgs e)
    {
        Response.AddHeader("Content-Disposition", "attachment;filename=" +
            HttpUtility.UrlEncode(DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls",
                System.Text.Encoding.UTF8));
        Response.ContentEncoding = System.Text.Encoding.Default;
        Response.ContentType = "application/ms-excel";
        System.IO.StringWriter sw = new System.IO.StringWriter();
        HtmlTextWriter hw = new HtmlTextWriter(sw);
        gv1.RenderControl(hw);
        Response.Write(sw.ToString());
        Response.End();
    }

    /// <summary>
    /// 必须重载该函数为空
    /// </summary>
    /// <param name="control"></param>
    public override void VerifyRenderingInServerForm(Control control)
    {
    }

用该方法导出的文件,如果我们用记事本打开就会发现其实也是标准的html代码,但是excel能够正常的识别,如果只是一般的用途也足够了,而且也不需要在服务器端配置excel的相关组件,一般用于轻量级的应用。

其实我们只要稍微修改一下代码,就可以将其导出为word文档,原理同导出excel一样,只能怪word和excel一样这么智能,均能识别html格式的文档了,以下是具体代码:

Response.AddHeader("Content-Disposition", "attachment;filename=" +
HttpUtility.UrlEncode(DateTime.Now.ToString("yyyyMMddHHmmss") + ".doc",
 System.Text.Encoding.UTF8));
Response.ContentEncoding = System.Text.Encoding.Default;
Response.ContentType = "application/ms-word";
System.IO.StringWriter sw = new System.IO.StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(sw);
gv1.RenderControl(hw);
Response.Write(sw.ToString());
Response.End();

Tags: , ,

技术生涯

Powered by BlogEngine.NET 1.6.1.9  登录
Original Design by Laptop Geek, Adapted by onesoft