Merhabalar,

Kullanığımız çeşitli excel dosyalarından kolonları kopyalayıp tek bir excel'de belirlenen yerlere yapıştırıyoruz. Bunu bir program aracılığı ile yapmak istedik. Senaryomuza göre belirlenen excellerin belirlenen kolonlarını alıp yine önceden belirlenen excel dosyasının belirlenen kolonlarına yapıştırmalı. Ben ilk olarak bir excelden kopyalıp diğer excele yapıştırmakla başladım. Adım adım geliştirmek istiyorum. Bir kod deneme oldu. Fakat başarılı olamadım. Kodu çalıştırdığımda hata alıyorum. Konu hakkında fikir, yorum ve kod örnekleriniz bana çok yardımcı olacaktır.

Teşekkürler, iyi çalışmalar dilerim.

Örnek form görününüm ve kod parçam;




using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;
using System.Collections;

namespace ExcelIslemleri
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

Excel.Application uygulama;
Excel.Workbook kitap;
Excel.Worksheet sayfa;


private void Form1_Load(object sender, EventArgs e)
{

}

private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog file = new OpenFileDialog();
file.Filter = "Excel Dosyası |*.xlsx| Excel Dosyası|*.xls";
// burada gördüğünüz gibi iki adet filtre verdik.
file.FilterIndex = 1;
// bu kod ile varsayılan olarak 2. filtre ile açılacaktır.
file.ShowDialog();

openFileDialog2.ShowDialog();
textBox1.Text = openFileDialog2.FileName;
}

private void button2_Click(object sender, EventArgs e)
{
int islemOK = 0;
try
{
if (textBox1.Text == "")
MessageBox.Show("Dosya Seçimini Yapınız...", "HATA", MessageBoxButtons.OK, MessageBoxIcon.Error);
else
{
DialogResult Cvp = MessageBox.Show("Tüm Excel Dosyalarınız Kapatılacak Onaylıyor Musunuz ?", "Uyarı", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (Cvp == DialogResult.Yes) //Farklı excel dosyaları açık olunca sebebini çözemediğim bir hata veriyor. Bende kapatıverdim.
{
foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses())
{
if (p.ProcessName == "EXCEL")
p.Kill();
}

islemOK = 1;
progressBar1.Visible = true;
progressBar1.Value = progressBar1.Value + 1;
uygulama = new Excel.Application();
kitap = uygulama.Workbooks.Open(textBox1.Text, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
progressBar1.Value = progressBar1.Value + 1;
object isim;
object deger;
ArrayList isimler = new ArrayList(); // Akılda kalmasını istediğim veriler için arraylist kullandık.
ArrayList degerler = new ArrayList();
ArrayList ilkYari = new ArrayList();
ArrayList AySonu = new ArrayList();
object misValue = System.Reflection.Missing.Value;
progressBar1.Value = progressBar1.Value + 1;
sayfa = (Excel.Worksheet)kitap.Worksheets.get_Item(2); // Sayfa sayıları sayılmaya 1 den başlıyor 15. sayfadaki veriler lazım bana
for (int i = 6; i <= 35; i++)
{
isim = sayfa.Cells[i, "F"].Value2; // 2. sayfayı tanıttıktan sonra, F sütünunda ki verileri alıyorum.
if (isim == null) isim = "";
ilkYari.Add(isim.ToString()); // Almış olduğumuz verileri akılda tutmak için
progressBar1.Value = progressBar1.Value + 1;
}
sayfa = (Excel.Worksheet)kitap.Worksheets.get_Item(1); // 33. sayfayı tanımlıyorum.

for (int i = 1; i <= 2; i++)
{
isim = sayfa.Cells[i, "B"].Value2; // B 'deki verileri taratıyoruz.
if (isim == null) isim = "";
AySonu.Add(isim);
progressBar1.Value = progressBar1.Value + 1;
}
int col = 2;
for (int ExcelSayac = 1; ExcelSayac <= 2; ExcelSayac++) // 2. sayfaya kadar tüm sayfaları taramam gerekiyor.
{

col = col + 1;
isimler.Clear();
degerler.Clear();
if (ExcelSayac != 2) // Sayfa 2 benim referans sayfamam burayı taratmıyorum.
{
sayfa = (Excel.Worksheet)kitap.Worksheets.get_Item(ExcelSayac); //for ile taradığımız sayfaları tanımlıyoruz. 1.sayfa 2.sayfa ...

for (int i = 1; i <= 2; i++)
{
isim = sayfa.Cells[i, "F"].Value2;//sayfa içerisindeki verileri alıyorum.
deger = sayfa.Cells[i, "B"].Value2; //sayfa içerisindeki verileri alıyorum.
if (deger == null) deger = "0"; // boş bırakılmışsa benim için 0 'dır.
isimler.Add(isim.ToString());
degerler.Add(deger.ToString());
}

if (ExcelSayac <= 1)
{
sayfa = (Excel.Worksheet)kitap.Worksheets.get_Item(1);// 2. sayfaya verileri yazacağım.
for (int i = 0; i < ilkYari.Count; i++)
{
int row = i + 1;

for (int j = 0; j < isimler.Count; j++)
{

if (ilkYari[i].ToString().ToUpper() == isimler[j].ToString().ToUpper())// Karşılaştırma yapılıyor.
{
sayfa.Cells[row, col] = degerler[j].ToString(); // eşitse veriyi yazıyorum.
degerler.RemoveAt(j); // yazdığım veriyi hafızadan siliyorum.
isimler.RemoveAt(j); // aynısını tekrar yapıyorum.
break; // döngüden çıksın ki, zaman kısalsın.
}
}
}
}
else
{
sayfa = (Excel.Worksheet)kitap.Worksheets.get_Item(1);// sayfa 1 e veri yazacağım.
for (int i = 0; i < AySonu.Count; i++)
{
int row = i + 1;
for (int j = 0; j < isimler.Count; j++)
{

if (AySonu[i].ToString().ToUpper() == isimler[j].ToString().ToUpper())
{
sayfa.Cells[row, col] = degerler[j].ToString();
degerler.RemoveAt(j);
isimler.RemoveAt(j);
break;
}
}
}
}

}
else
col = 2;
progressBar1.Value = progressBar1.Value + 1;
}



kitap.SaveAs(textBox1.Text, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); // excel dosyasını kaydediyorum.
kitap.Close(true, misValue, misValue); //kitabı kapatıyorum.
uygulama.Quit();// Uygulamayı kapatıyorum.
}
}
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
uygulama.Quit();
}
finally
{
if (islemOK == 1)
{
progressBar1.Value = progressBar1.Maximum;
MessageBox.Show("İŞLEM BAŞARIYLA TAMAMLANDI.", "BİLGİLENDİRME", MessageBoxButtons.OK, MessageBoxIcon.Information);
Application.Exit(); // Programı kapatmayınca tekrar tekrar işlem yapıyorlar :)
}// Sizin işlem fazla olursa Progressbar dan hata alabilirsiniz. max. değeri geçtiği için.
}
}
}
}


Almış olduğum hata;