none
匯出Excel格式問題 RRS feed

  • 問題

  • 原先於資料庫select後的data為class  partno  machine
                                                   甲   02      1
                                                   甲       02      4
                                                   甲       14      5
                                                   乙       15      6
    希望匯出excel的格式為-->>    class   partno   machine
                                                  甲        02     1,4
                                                             14       5
                                                  乙        15       6


    請問我該如何用程式來達到我想匯出的格式呢?

    2007年12月7日 上午 10:03

解答

  • 簡單寫一個給你看看...不過記得原始資料要先對 class 與 partno 排序...

    程式碼區塊
    using System;
    using System.Data;
    using System.IO;
    using System.Windows.Forms;
    using OfficeOpenXml;

     

     

    程式碼區塊

    private void button1_Click(object sender, EventArgs e)
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("class", typeof (string));
        dt.Columns.Add("partno", typeof (string));
        dt.Columns.Add("machine", typeof (string));

        dt.Rows.Add("甲", "02", "1");
        dt.Rows.Add("甲", "02", "4");
        dt.Rows.Add("甲", "14", "5");
        dt.Rows.Add("乙", "15", "6");

     

        // ------------------------------------------------------

     

        DataTable newdt = new DataTable();
        newdt.Columns.Add("class", typeof (string));
        newdt.Columns.Add("partno", typeof (string));
        newdt.Columns.Add("machine", typeof (string));
        newdt.Rows.Add("class", "partno", "machine");

     

        // ------------------------------------------------------

        string lastClass = "";
        string lastPartno = "";
        int count = dt.Rows.Count;
        int len = 0;

     

        for (int i = 0; i < count; i++)
        {
            string tmpClass = dt.Rows[i]["class"].ToString();
            string tmpPartno = dt.Rows[i]["partno"].ToString();
            string tmpMachine = dt.Rows[i]["machine"].ToString();

            if (tmpClass == lastClass && tmpPartno != lastPartno)
            {
                newdt.Rows.Add("", tmpPartno, tmpMachine);
                len++;
            }
            else if (tmpClass == lastClass && tmpPartno == lastPartno)
            {
                newdt.Rows[len]["machine"] += string.Format(", {0}", tmpMachine);
            }
            else
            {
                newdt.Rows.Add(tmpClass, tmpPartno, tmpMachine);
                len++;
            }

            lastClass = tmpClass;
            lastPartno = tmpPartno;
        }

     

        // ------------------------------------------------------

     

        FileInfo newFile = new FileInfo("output.xlsx");
        using (ExcelPackage xlPackage = new ExcelPackage(newFile))
        {
            ExcelWorksheet worksheet = xlPackage.Workbook.Worksheets.Add("Test WorkSheet");

            for (int i = 0; i <= len; i++)
            {
                worksheet.Cell(i + 1, 1).Value = newdt.Rows[i]["class"].ToString();
                worksheet.Cell(i + 1, 2).Value = newdt.Rows[i]["partno"].ToString();
                worksheet.Cell(i + 1, 3).Value = newdt.Rows[i]["machine"].ToString();
            }

            xlPackage.Save();
        }
    }

     

     

    2007年12月8日 下午 12:18

所有回覆

  • 自己寫程式匯出吧。沒有簡單的作法。

     

    以下是參考資料:

     

    How to transfer data to an Excel workbook by using Visual C# 2005 or Visual C# .NET
    http://support.microsoft.com/kb/306023/en-us

    如何將資料傳送至 Excel 活頁簿藉由使用 Visual C# 2005 或 Visual C# . NET
    http://support.microsoft.com/kb/306023/zh-tw

    Considerations for server-side Automation of Office
    http://support.microsoft.com/kb/257757/en-us

    Office 伺服器端自動化的考量因素
    http://support.microsoft.com/kb/257757/zh-tw

    How to automate Microsoft Excel from Visual Basic .NET
    http://support.microsoft.com/kb/301982/en-us

    如何從 Visual Basic . NET Microsoft Excel 自動化
    http://support.microsoft.com/kb/301982/zh-tw


    ----
    From: Will
    Blog: http://blog.miniasp.com/
    記載著 Will 在網路世界的學習心得與技術分享

     

     

    2007年12月7日 上午 10:58
  • 現在可以利用 ExcelPackage 來產生 Excel 文件,比以前輕鬆愉快一些。

    參考: How to create Microsoft Excel 2007 files on the server

     

    2007年12月7日 下午 05:14
  • 不好意思,是否有其他類似範例(by 中文,英文內容閱讀有點吃力^^")

    2007年12月8日 下午 12:13
  • 簡單寫一個給你看看...不過記得原始資料要先對 class 與 partno 排序...

    程式碼區塊
    using System;
    using System.Data;
    using System.IO;
    using System.Windows.Forms;
    using OfficeOpenXml;

     

     

    程式碼區塊

    private void button1_Click(object sender, EventArgs e)
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("class", typeof (string));
        dt.Columns.Add("partno", typeof (string));
        dt.Columns.Add("machine", typeof (string));

        dt.Rows.Add("甲", "02", "1");
        dt.Rows.Add("甲", "02", "4");
        dt.Rows.Add("甲", "14", "5");
        dt.Rows.Add("乙", "15", "6");

     

        // ------------------------------------------------------

     

        DataTable newdt = new DataTable();
        newdt.Columns.Add("class", typeof (string));
        newdt.Columns.Add("partno", typeof (string));
        newdt.Columns.Add("machine", typeof (string));
        newdt.Rows.Add("class", "partno", "machine");

     

        // ------------------------------------------------------

        string lastClass = "";
        string lastPartno = "";
        int count = dt.Rows.Count;
        int len = 0;

     

        for (int i = 0; i < count; i++)
        {
            string tmpClass = dt.Rows[i]["class"].ToString();
            string tmpPartno = dt.Rows[i]["partno"].ToString();
            string tmpMachine = dt.Rows[i]["machine"].ToString();

            if (tmpClass == lastClass && tmpPartno != lastPartno)
            {
                newdt.Rows.Add("", tmpPartno, tmpMachine);
                len++;
            }
            else if (tmpClass == lastClass && tmpPartno == lastPartno)
            {
                newdt.Rows[len]["machine"] += string.Format(", {0}", tmpMachine);
            }
            else
            {
                newdt.Rows.Add(tmpClass, tmpPartno, tmpMachine);
                len++;
            }

            lastClass = tmpClass;
            lastPartno = tmpPartno;
        }

     

        // ------------------------------------------------------

     

        FileInfo newFile = new FileInfo("output.xlsx");
        using (ExcelPackage xlPackage = new ExcelPackage(newFile))
        {
            ExcelWorksheet worksheet = xlPackage.Workbook.Worksheets.Add("Test WorkSheet");

            for (int i = 0; i <= len; i++)
            {
                worksheet.Cell(i + 1, 1).Value = newdt.Rows[i]["class"].ToString();
                worksheet.Cell(i + 1, 2).Value = newdt.Rows[i]["partno"].ToString();
                worksheet.Cell(i + 1, 3).Value = newdt.Rows[i]["machine"].ToString();
            }

            xlPackage.Save();
        }
    }

     

     

    2007年12月8日 下午 12:18
  • 真的十分感謝您,您的寫法是asp.net吧,忘了說我寫的是vb.net,語法大致通用嗎?

    2007年12月8日 下午 12:57
  • 我寫的是 WinForm 用的語法是 C#...

     

    線上轉換工具給你參考:

    Convert C# to VB.NET

    Convert C# code to VB.NET

    Free Code Translation for .NET (C#<->VB.NET)

    ConvertCSharp2VB

     

    2007年12月8日 下午 02:59