0

ソースのExcelファイルからc#で新しく作成したExcelシートに特定のシートをコピーする必要がありましたが、あなたの助けを借りて成功することができました。しかし、このような解決策を見つけることができないもう1つの問題があります。

選択したシートをプログラムによって作成された新しいExcelファイルにコピーすると、セルからセルへのリンクはソースファイルの場合と同じように残りますが、"C:[sample.xlsx]FinancingSchedule'!O266"に変更したいと思い "C:newlycreated.xlsx]FinancingSchedule'!O266"ます。

それを行う方法はありますか?前もって感謝します

また、前の質問とコード:

選択したシートをExcelファイルからプログラムによって作成された新しいExcelファイルにコピーする方法

4

2 に答える 2

2

これを参照してください。コードを理解するのに問題がないように、コードにコメントを付けました。

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

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

        private void button1_Click(object sender, EventArgs e)
        {
            Excel.Application xlexcel;
            Excel.Workbook xlWorkBook;
            Excel.Workbook xlWorkBookNew;
            Excel.Sheets worksheets;

            //~~> Path to save the new file
            String NewPath = "C:\\";

            //~~> name of the newly created file
            String NewFileName = "newlycreated";

            object misValue = System.Reflection.Missing.Value;

            xlexcel = new Excel.Application();

            xlexcel.Visible = true;

            //~~> Open a File
            xlWorkBook = xlexcel.Workbooks.Open("C:\\Sample.xlsx", 0, true, 5, "", "", true,
            Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);

            //~~> Specify the sheets you want to copy
            String[] selectedSheets = { "a", "c", "d" };

            //~~> Set your worksheets
            worksheets = xlWorkBook.Worksheets;

            //~~>Copy it. This will create a new Excel file with selected sheets
            ((Excel.Sheets)worksheets.get_Item(selectedSheets)).Copy();

            xlWorkBookNew = xlexcel.ActiveWorkbook;

            //~~> Save the new workbook
            xlWorkBookNew.SaveAs(NewPath + NewFileName + ".xlsx", Excel.XlFileFormat.xlOpenXMLWorkbook, 
            misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive,
            misValue, misValue, misValue, misValue, misValue);

            //~~> Loop through the sheets of the new workbook and replace "Sample.xlsx" with "newlycreated.xlsx"
            foreach (Excel.Worksheet xlsheet in xlWorkBookNew.Sheets) 
            {
                xlsheet.Cells.Replace("Sample.xlsx", NewFileName + ".xlsx", Excel.XlLookAt.xlWhole,
                Excel.XlSearchOrder.xlByRows, false, false, false);

            }

            //~~> Close and Cleanup
            xlWorkBookNew.Close(true, misValue, misValue);
            xlWorkBook.Close(false, misValue, misValue);
            xlexcel.Quit();

            releaseObject(worksheets);
            releaseObject(xlWorkBookNew);
            releaseObject(xlWorkBook);
            releaseObject(xlexcel);

        }

        private void releaseObject(object obj)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                obj = null;
            }
            catch (Exception ex)
            {
                obj = null;
                MessageBox.Show("Exception Occured while releasing object " + ex.ToString());
            }
            finally
            {
                GC.Collect();
            }
        }
    }
}
于 2013-01-24T08:32:12.153 に答える
0

私が間違っていない場合は、シートをコピーし、新しく作成したシートに、すべての古いシートデータをそのまま配置します。つまり、古いシートデータがcellB1から表示を開始した場合、新しく作成されたシートもcellB1からデータを開始します。この場合、古いシートデータをセルごとに読み取り、どのセルデータ(古いシートから)がどのセル(新しく作成されたシート)に入るのかを新しいシートに明示的に伝える必要があります。シートのコピーは非常に簡単ではるかに高速ですが、新しく作成したシートデータの位置を変更する必要がある場合は、特に大量のデータをコピーする場合のパフォーマンスの問題に注意する必要があります。このアプローチに本当に興味がある場合は、コード例を提供できます。よろしく、

于 2013-01-23T12:18:48.060 に答える