2017-03-22 1 views
1

누구든지 내 코드에서 누락 된 내용을 알려주십시오. 오류없이 실행되지만 내 Excel 파일에는 쓰지 않습니다. 난 그냥 내 스프레드 시트의 상업 탭에서 A1 셀에 쓸 수 있도록 노력하고 있어요.OpenXML을 사용하여 기존 Excel 파일에 쓰기

내 코드는 다음과 같습니다 :

using System; 
using System.Data; 
using Microsoft.SqlServer.Dts.Runtime; 
using System.Windows.Forms; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.Reflection; 
using System.Data.OleDb; 
using DocumentFormat.OpenXml; 
using DocumentFormat.OpenXml.Packaging; 
using DocumentFormat.OpenXml.Spreadsheet; 
using System.Xml; 
using System.Diagnostics; 

namespace Application.Model 
{ 
    [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute] 
    public class TempCode :   Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase 
    { 
     string FilePath; 
     string FileName; 
     string FileExceptionsPath; 
     string FileExceptionsName; 
     string Exceptions = ""; 

    public void Main() 
    { 
     try 
     { 
      FilePath = (string)Dts.Variables["FilePath"].Value; 
      FileName = (string)Dts.Variables["User::FileName"].Value; 
      FileExceptionsPath = (string)Dts.Variables["FileExceptionsPath"].Value; 
      FileExceptionsName = (string)Dts.Variables["User::FileExceptionsName"].Value; 
      Dts.Variables["User::FileAbsolutePath"].Value = (string)Dts.Variables["FilePath"].Value + (string)Dts.Variables["User::FileName"].Value; 
      Dts.Variables["User::FileAbsoluteExceptionsPath"].Value = (string)Dts.Variables["FileExceptionsPath"].Value + (string)Dts.Variables["User::FileExceptionsName"].Value; 

      CreateExcel(new Object(), new EventArgs()); 

      Dts.TaskResult = (int)ScriptResults.Success; 
     } 
     catch (Exception ex) 
     { 
      Dts.Events.FireError(0, "File Task", ex.Message, String.Empty, 0); 

      Dts.TaskResult = (int)ScriptResults.Failure; 
     } 
    } 

    public void CreateExcel(object sender, EventArgs e) 
    { 
     Directory.CreateDirectory(FilePath); 

     string fileTest = FilePath + FileName; 
     if (File.Exists(fileTest)) 
     { 
      File.Delete(fileTest); 
     } 
     string templateTest = FilePath + "Test.xlsx"; 

     CopyFile(templateTest, fileTest); 

     UpdateCell(fileTest, "120", 1, "A"); 

     if (Exceptions != "") 
     { 
      LogExceptions(FileExceptionsPath, FileExceptionsName, Exceptions); 
     } 
    } 

    public void LogExceptions(string FileExceptionsPath, string FileExceptionsName, string data) 
    { 
     Directory.CreateDirectory(FileExceptionsPath); 
     using (var writer = new StreamWriter(FileExceptionsPath + FileExceptionsName)) 
     { 
      List<string> exceptionsList = data.Split('~').ToList(); 

      foreach (var ex in exceptionsList) 
      { 
       writer.WriteLine(ex, true); 
      } 
     } 
    } 

    private string CopyFile(string source, string dest) 
    { 
     string result = "Copied file"; 
     try 
     { 
      File.Copy(source, dest, true); 
     } 
     catch (Exception ex) 
     { 
      result = ex.Message; 
     } 
     return result; 
    } 

    public static void UpdateCell(string docName, string text, uint rowIndex, string columnName) 
    { 
     using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(docName, true)) 
     { 
      WorksheetPart worksheetPart = GetWorksheetPartByName(spreadSheet, "Commercial"); 
      if (worksheetPart != null) 
      { 
       Cell cell = GetCell(worksheetPart.Worksheet, columnName, rowIndex); 
       cell.CellValue = new CellValue(text); 
       cell.DataType = new EnumValue<CellValues>(CellValues.Number); 
       worksheetPart.Worksheet.Save(); 
      } 
      spreadSheet.WorkbookPart.Workbook.Save(); 
     } 

    } 

    private static WorksheetPart GetWorksheetPartByName(SpreadsheetDocument document, string sheetName) 
    { 
     IEnumerable<Sheet> sheets = document.WorkbookPart.Workbook.GetFirstChild<Sheets>(). 
         Elements<Sheet>().Where(s => s.Name == sheetName); 
     if (sheets.Count() == 0) 
     { 
      return null; 
     } 
     string relationshipId = sheets.First().Id.Value; 
     WorksheetPart worksheetPart = (WorksheetPart)document.WorkbookPart.GetPartById(relationshipId); 
     return worksheetPart; 
    } 


    private static Cell GetCell(Worksheet worksheet, string columnName, uint rowIndex) 
    { 
     Row row; 
     string cellReference = columnName + rowIndex; 
     if (worksheet.Elements<Row>().Where(r => r.RowIndex == rowIndex).Count() != 0) 
      row = worksheet.GetFirstChild<SheetData>().Elements<Row>().Where(r => r.RowIndex == rowIndex).FirstOrDefault(); 
     else 
     { 
      row = new Row() { RowIndex = rowIndex }; 
      worksheet.Append(row); 
     } 

     if (row == null) 
      return null; 

     if (row.Elements<Cell>().Where(c => c.CellReference.Value == cellReference).Count() > 0) 
     { 
      return row.Elements<Cell>().Where(c => c.CellReference.Value == cellReference).First(); 
     } 
     else 
     { 
      Cell refCell = null; 
      foreach (Cell cell in row.Elements<Cell>()) 
      { 
       if (string.Compare(cell.CellReference.Value, cellReference, true) > 0) 
       { 
        refCell = cell; 
        break; 
       } 
      } 
      Cell newCell = new Cell() 
      { 
       CellReference = cellReference, 
       StyleIndex = (UInt32Value)1U 

      }; 
      row.InsertBefore(newCell, refCell); 
      worksheet.Save(); 
      return newCell; 
     } 
    } 

    #region ScriptResults declaration 
    /// <summary> 
    /// This enum provides a convenient shorthand within the scope of this class for setting the 
    /// result of the script. 
    /// 
    /// This code was generated automatically. 
    /// </summary> 
    enum ScriptResults 
    { 
     Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success, 
     Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure 
    }; 
    #endregion 

} 

}

+0

디버깅을하셨습니까? 모든 코드가 실행되고 있다고 확신합니까? 너 뭐 해봤 니? –

답변

1

문제는 당신이 SheetData 객체를 생성하지 않은 것입니다. 여기해야 할 일이 있습니다.

이것은 어떻게 만들어야하는지 보여주기위한 것이고, 'GetCell'메서드는 워크 시트와 SheetData가 이미 존재하는지 확인하고 그렇지 않은 경우 확인해야합니다.

public static void UpdateCell(string docName, string text, uint rowIndex, string columnName) 
{ 
    using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(docName, true)) 
    { 
     WorksheetPart worksheetPart = GetWorksheetPartByName(spreadSheet, "Commercial"); 
     if (worksheetPart != null) 
     { 
      // Create new Worksheet 
      Worksheet worksheet = new Worksheet(); 
      worksheetPart.worksheet = worksheet; 

      // Create new SheetData 
      SheetData sheetData = new SheetData(); 

      // Create new row 
      Row row = new Row(){ RowIndex = rowIndex }; 

      // Create new cell 
      Cell cell = new Cell() { CellReference = columnName + rowIndex, DataType = CellValues.Number, CellValue = new CellValue(text) }; 

      // Append cell to row 
      row.Append(cell); 

      // Append row to sheetData 
      sheetData.Append(row); 

      // Append sheetData to worksheet 
      Worksheet.Append(sheetData); 

      worksheetPart.Worksheet.Save(); 
     } 
     spreadSheet.WorkbookPart.Workbook.Save(); 
    } 

} 
+0

좋은 결과를 얻는 방법은 다음과 같습니다. [link] (https://msdn.microsoft.com/en-us/library/office/cc861607.aspx) – Miguel

관련 문제