2016-12-14 30 views
1

我是使用EPPlus的新手。使用EPPlus来转换Excel单元格的位置

我想要一个单元格,相对于一个起点,实现这个目标的最佳方法是什么?

E.g:

var startLocation = "C5"; 
var newLocation1 = TLoc(startLocation, 2, 3); //E8 
var newLocation2 = TLoc(startLocation, 0, 1); //C6 

现在我写这个方法我自己,因为我不熟悉EPPlus功能:

/// <summary> 
/// Use EPPlus to translate the Location. 
/// </summary> 
/// <param name="startLocation"></param> 
/// <param name="columns"></param> 
/// <param name="rows"></param> 
/// <returns></returns> 
private string TLoc(string startLocation, int columns, int rows) 
{ 
    using (ExcelPackage tmpPack = new ExcelPackage()) 
    { 
     var tmpWs = tmpPack.Workbook.Worksheets.Add("temp"); 
     var startCell = tmpWs.Cells[startLocation]; 

     int startColumn = startCell.Start.Column; 
     int startRow = startCell.Start.Row; 

     int tColumn = startColumn + columns; 
     int tRow = startRow + rows; 

     ExcelAddress translatedAddress = new ExcelAddress(tRow, tColumn, tRow, tColumn); 

     return translatedAddress.ToString(); 
    } 
} 

请告诉我一个例子或链接我的文档。谢谢!

更具体一些:使用EPPlus来实现此功能的示例。

我喜欢在可用时使用成熟的技术,而不用冒着引入新bug的风险。

回答

1

对于EPPlus具体的解决办法,我能想到的唯一的办法就是“最短”是这样的:

//Prints "E8" 
Console.WriteLine(ExcelCellBase.TranslateFromR1C1(ExcelCellBase.TranslateToR1C1("C5", -3, -2), 0, 0)); 

//Prints "C8" 
Console.WriteLine(ExcelCellBase.TranslateFromR1C1(ExcelCellBase.TranslateToR1C1("C5", -1, 0), 0, 0)); 

不干净的,但因为他们的它制造商didnt暴露翻译函数支持这两种方法,我们不能直接使用它,直接不幸的。

1

我希望这可以帮到你,我不清楚你的问题。 但我希望你能找到像这样的东西。

这是用于将整数行转换为整数列到Excel地址的解决方案。

它需要数据之前和返回到Excel工作表

public class ExcelAddress 
    { 
     public readonly string LabelCell; 
     public readonly string ColumnAddress; 
     public readonly int ColumnAddressNumber; 
     public readonly int RowAddressNumber; 
     public readonly string RowAddress; 
     public readonly string CellAddress; // this will give you address 

     public ExcelAddress(int colNum, int rowNum, string Label) 
     { 
      ColumnAddressNumber = colNum; 
      ColumnAddress = ExcelCellAddressConvertor.FromIntegerIndexToColumnLetter(ColumnAddressNumber); 
      RowAddressNumber = rowNum; 
      RowAddress = RowAddressNumber.ToString(); 
      LabelCell = Label; 
      CellAddress = ColumnAddress + RowAddress; 
     } 
    } 

后创建的地址,这里是转换器类为地址映射

using System; 
using System.Text.RegularExpressions; 

namespace BLABLA 
{ 
    public static class ExcelCellAddressConvertor 
    { 
     public static string FromIntegerIndexToColumnLetter(int intCol) 
     { 
      var intFirstLetter = ((intCol)/676) + 64; 
      var intSecondLetter = ((intCol % 676)/26) + 64; 
      var intThirdLetter = (intCol % 26) + 65; 

      var firstLetter = (intFirstLetter > 64) 
       ? (char)intFirstLetter : ' '; 
      var secondLetter = (intSecondLetter > 64) 
       ? (char)intSecondLetter : ' '; 
      var thirdLetter = (char)intThirdLetter; 

      return string.Concat(firstLetter, secondLetter, 
       thirdLetter).Trim(); 
     } 

     public static int ConvertColumnNameToNumber(string columnName) 
     { 
      var alpha = new Regex("^[A-Z]+$"); 
      if (!alpha.IsMatch(columnName)) throw new ArgumentException(); 

      char[] colLetters = columnName.ToCharArray(); 
      Array.Reverse(colLetters); 

      var convertedValue = 0; 
      for (int i = 0; i < colLetters.Length; i++) 
      { 
       char letter = colLetters[i]; 
       // ASCII 'A' = 65 
       int current = i == 0 ? letter - 65 : letter - 64; 
       convertedValue += current * (int)Math.Pow(26, i); 
      } 

      return convertedValue; 
     } 
    } 
} 

EEPLUS为Excel自动化好的API,

但仍然简单明了

我会记mmended你http://spreadsheetlight.com/

+0

谢谢你的回答。但我正在尝试使用EPPlus软件包。 –

+0

以上的答案不仅适用于EPPLus,您可以使用任何你喜欢的东西... –

+0

以上的答案不仅适用于EPPLus,你可以使用任何你喜欢的东西,一般它会为你提供excel地址的转换。 –

相关问题