Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Xml --> Excel


Автор: Azzdorf 6.7.2007, 11:22
Работаю с базой данных Access, и появилась необходимость построения отчетов. С Access очень легко получить, через SQL-запрос, нужные данные в обект DataSet, его же легко засунуть в XML- файлик.

Та вот, сама проблема -теперь есть необходимость братьдолепливать поверх данных XML- файла шапку и липить это всё дело в файл Excel, или использовать шаблон Excel.

Топиков по Excel перечитал уйму, но ничего стоящего так и не обнаружил. Плиз ХЕЛП народ. Ссылки на статьи, исходники (с пояснениями), любую инфо по данныому дело, за все буду благодарен.

Автор: thomas 6.7.2007, 11:46
Azzdorf
Почитай http://www.gotdotnet.ru/LearnDotNet/XMLWebServices/30833.aspx#t4

А так же http://www.gotdotnet.ru/LearnDotNet/NETFramework/22054.aspx для общего развития и ещеhttp://wladm.narod.ru/C_Sharp/comexcel.html

Автор: Azzdorf 6.7.2007, 14:27
thomas

спасибочки, часть уже прочитал нужные вещи, особенно 1 и 3 статейки smile , а вот 2 (про объектную модель на ДОТНЕТ) уже читал недавно, там много чего есть, но всё слишком не структуризировано и тяжлило что-то конкретное найти smile  smile 

буду дерзать smile 
хотя еще откырыт для предложений smile 

топик не закрываю, может еще чего-то интерестного подкинет кто-либо smile 
к тому же посля готовый исходничек с описанием выложу, как токо закончу smile 

Автор: Azzdorf 7.7.2007, 12:28
более внимательно почитал статейки и ничего там нужного не нашол smile ,  статей про Импорт XML-карт, XML-списков и источников данных динамических диаграмм в Excel 2003  - то чучуть не то и к тому же НА VB нашкрябано, а мне нужно реализовать выборку и сохранение данных самой программой. без вмешательство в Ексель. всё должна делать сама програма с дружественны пользовательским интерфейсом

топик остается открым XML --> EXCEL smile 


так что ищем дальше smile 

Автор: Azzdorf 9.7.2007, 11:20
вообщем искал как переделывать ХМЛ в Ексель, но понял, что всё там не так просто потому как там нада ХМЛку знать на уровне - все теги и атрубуты и всё остальное,

но моеё главной целью - было екпортировать данные з Акцеса в Ексель посредством ХМЛ, и нашол я бругое решение --> сразу из дата сета в Ексель,  принцип сложылся такой: полчаем ДатаСет далее пробегаемся по нему циклом и превращаем его в стринговый прямоугольный масив после вставляем данный масивчик в ексель, только токо пока одна загвоздка которую не решил - столбцы, строки то с цифрами, я побыстрому расчетик набросал, а со столбцами додумываете ому нада сами, так как у меня  количество столбцов меняться не будет, для работы програмы нужны:
-база данных(АкцесЮ, еСКюЛь или оракл - хто что прелепит)
-шаблон документа из шапкой - тут же в програме можна выставить начальные - входящие ячейки

вообщем поличился такой пример:

Да народ там когда сохраняеш отчёт сначала выбираеш шаблон - потом куда сохранять.... smile 


Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Data.ProviderBase;
using System.Data.Sql;
using System.Drawing;
using System.Reflection;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using Office;

public class MyExcel : Form
{
    [method: STAThread]
    public static int Main(string[] args)
    {
        Application.Run(new MyExcel());
        return 0;
    }

    MainMenu mainM;
    public DataGridView dgvTable = new DataGridView();
    public TextBox txtRequest = new TextBox();
    public Button btnRequest = new Button();
    public Button btnSeveZvit = new Button();

    DataSet myDS;

    string dbURL;
    string dbREQU;
    string xlsBlankURL;
    string xlsResultURL;

    public MyExcel()
    {
        CenterToScreen();
        this.Size = new Size(400, 400);

        InitializeComponent();
    }
    // Controls
    public void InitializeComponent()
    {
        FormBorderStyle = FormBorderStyle.FixedSingle;
        MainMenu_MethodConstr();
        DataGridView_MethodConstr();
        TextBox_MethodConstr();
        Button_MethodConstr();
    }
    public void MainMenu_MethodConstr()
    {
        mainM = new MainMenu();
        MenuItem miGeneral = mainM.MenuItems.Add("General");
        MenuItem miDataBase = miGeneral.MenuItems.Add("Data Base");
        miDataBase.MenuItems.Add(new MenuItem("Choose db", new EventHandler(this.ChooseDB_Click), Shortcut.CtrlO));
        MenuItem miRequest = miGeneral.MenuItems.Add("Request");
        miRequest.MenuItems.Add(new MenuItem("Do Request", new EventHandler(this.DoRequest_Click), Shortcut.CtrlD));
        miRequest.MenuItems.Add(new MenuItem("Save Request", new EventHandler(this.SaveRequest_Click), Shortcut.CtrlS));
        this.Menu = mainM;
    }
    public void DataGridView_MethodConstr()
    {
        dgvTable.Location = new Point(10, 10);
        dgvTable.Size = new Size(375, 200);
        dgvTable.ReadOnly = true;
        Controls.Add(dgvTable);
    }
    public void TextBox_MethodConstr()
    {
        txtRequest.Location = new Point(10, 220);
        txtRequest.Size = new Size(375, 25);
        txtRequest.TextAlign = HorizontalAlignment.Center;
        txtRequest.Text = "SELECT * FROM table1";
        Controls.Add(txtRequest);
    }
    public void Button_MethodConstr()
    {
        btnRequest.Location = new Point(10, 250);
        btnRequest.Size = new Size(100, 25);
        btnRequest.Text = "Do Request";
        btnRequest.FlatStyle = FlatStyle.Flat;
        btnRequest.Click += new EventHandler(btnRequest_Click);
        btnRequest.Enabled = false;
        Controls.Add(btnRequest);

        btnSeveZvit.Location = new Point(120, 250);
        btnSeveZvit.Size = new Size(100, 25);
        btnSeveZvit.Text = "Save Request";
        btnSeveZvit.FlatStyle = FlatStyle.Flat;
        btnSeveZvit.Click += new EventHandler(btnSeveZvit_Click);
        btnSeveZvit.Enabled = false;
        Controls.Add(btnSeveZvit);
    }
    // MainMenu Procesing
    private void ChooseDB_Click(object sender, EventArgs e)
    {
        OpenDB();
    }
    private void DoRequest_Click(object sender, EventArgs e)
    {
        DoRequest();
    }
    private void SaveRequest_Click(object sender, EventArgs e)
    {
        SaveRequest();
    }
    // Controls Provesung
    private void btnRequest_Click(object sender, EventArgs e)
    {
        DoRequest();
    }
    private void btnSeveZvit_Click(object sender, EventArgs e)
    {
        SaveRequest();
    }
    // DataBase
    public void OpenDB()
    {
        OpenFileDialog myOD = new OpenFileDialog();
        myOD.InitialDirectory = ".";
        myOD.Filter = "Access DB files (*.mdb)|*.mdb|All files(*.*)|*.*";
        myOD.FilterIndex = 1;
        myOD.RestoreDirectory = true;

        if (myOD.ShowDialog() == DialogResult.OK)
        {
            if (myOD.FileName.Contains(".mdb"))
            {
                dbURL = null;
                dbURL = myOD.FileName.ToString();
            }
        }
        btnRequest.Enabled = true;
    }
    // Request
    public void DoRequest()
    {
        dbREQU = txtRequest.Text;

        OleDbConnection cn = new OleDbConnection();
        cn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0; data source = " + dbURL + "";
        cn.Open();

        string sqlSELECT = dbREQU;
        OleDbDataAdapter dAdapt = new OleDbDataAdapter(sqlSELECT, cn);

        myDS = new DataSet("baseDS");
        dAdapt.Fill(myDS, "baseDT");

        cn.Close();

        dgvTable.DataSource = myDS.Tables["baseDT"];
        btnSeveZvit.Enabled = true;
    }
    public void SaveRequest()
    {
        int toI = myDS.Tables["baseDT"].Rows.Count;
        int toJ = myDS.Tables["baseDT"].Columns.Count;

        string[,] strArr = new string[toI, toJ];
        
        DataTable dt = myDS.Tables["baseDT"];
        
        for (int i = 0; i <= toI-1; i++)
        {
            for (int j = 0; j <= toJ-1; j++)
            {
                strArr[i, j] = dt.Rows[i][j].ToString();
            }
        }

        int cellInside = 3;
        int cellOut = cellInside + toI - 1;

        OpenFileDialog ofd = new OpenFileDialog();
        ofd.InitialDirectory = ".";
        ofd.Filter = "Excel file BLANK (*.xls)|*.xls|All files(*.*)|*.*";
        ofd.FilterIndex = 1;
        ofd.RestoreDirectory = true;

        if (ofd.ShowDialog() == DialogResult.OK)
        {
            if (ofd.FileName.Contains(".xls"))
            {
                xlsBlankURL = null;
                xlsBlankURL = ofd.FileName.ToString();

                txtRequest.Text = xlsBlankURL;

                object optional = Missing.Value;
                Excel.Application app = new Excel.Application();
                Excel.Workbook wb1 = app.Workbooks.Open(xlsBlankURL, optional, optional, optional, optional, optional, optional, optional, optional, optional, optional, optional, optional);
                Excel.Worksheet ws1 = (Excel.Worksheet)wb1.Worksheets[1];
                Excel.Range rng;

                SaveFileDialog sfd = new SaveFileDialog();
                sfd.InitialDirectory = ".";
                sfd.Filter = "Excel file RESULT (*.xls)|*.xls|All files(*.*)|*.*";
                sfd.FilterIndex = 1;
                sfd.RestoreDirectory = true;

                if (sfd.ShowDialog() == DialogResult.OK)
                {
                    if (sfd.FileName.Contains(".xls"))
                    {
                        xlsResultURL = null;
                        xlsResultURL = sfd.FileName.ToString();

                        rng = ws1.get_Range("A"+cellInside+"", "C"+cellOut+"");
                        
                        rng.Value = strArr;

                        wb1.SaveAs(xlsResultURL, optional, optional, optional, optional, optional, Excel.XlSaveAsAccessMode.xlShared, optional, optional, optional, optional);

                        txtRequest.Text = xlsResultURL;
                        app.Quit();
                    }
                }
            }
        }
    }
}



кому нада - можете написать красивее, я лучше не умею


есть также небольшая прось ба к модераторам, ну если можна измените названице темы, или хоть какой-то тег напишете, такая штучка новичкам понадобиться

Даеш открытие ИСХОДНИКИ!!!!

дополнительно читаем здеся и ищем по форуму - собирал кусочками:
www.gotdotnet.ru/LearnDotNet/NETFramework/22054.aspx
http://forum.vingrad.ru/forum/topic-88374/hl/%25D1%2588%25D0%25B0%25D0%25B1%25D0%25BB%25D0%25BE%25D0%25BD+excel/index.html

Автор: it_medved 13.1.2009, 02:25
using Office; - 
Error    1    The type or namespace name 'Office' could not be found (are you missing a using directive or an assembly reference?)
dllки загрузил из AddReferences, там два варианта, никакая не работает, она так и называется - Office

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)