我正在使用c#4.0并且正在从一个Excel工作表读取并从每个列中获取值然后在另一个工作表上我只写每列的不同值。
即。如果结果表有:
COLA COLB COLC
----- ------- -------
dog cow rabbit
cat moose hare
dog moose bunny
bird yak hare
fish fox
bunny
weasel
fox
bunny
然后不同的表应该有(每列中的排序并不重要):
COLA COLB COLC
----- ------- -------
dog cow rabbit
cat moose hare
bird yak weasel
fish fox
bunny
任何人都可以建议一种更简单的方法(仍然使用com interop excel),否则需要使用这个丑陋的2d对象数组,arraylist组合,列表回到array.etc。
这是我的工作进度代码,感觉我走的方向错误:
for (int c = 0; c < num_of_cols; c++)
{
string colref = NumToLetter(c + 1);
int lastRow = workbook.Sheets["Results"].Cells[workbook.Sheets["Results"].Rows.Count, colref].End(MSExcel.XlDirection.xlUp).Row;
MSExcel.Range excelRange = workbook.Sheets["Results"].Range[colref + "2:" + colref + lastRow];
object[,] valueArray = (object[,])excelRange.get_Value(MSExcel.XlRangeValueDataType.xlRangeValueDefault);
List<ArrayList> distinctList = new List<ArrayList>();
for (int index = 0; index < num_of_cols.Length; index++)
distinctList.Add(new ArrayList());
for (int i = 1; i <= valueArray.GetUpperBound(0); i++)
{
if (valueArray[i, 1] != null)
{
if (!distinctList[c].Contains(valueArray[i, 1].ToString()))
distinctList[c].Add(valueArray[i, 1].ToString());
}
}
var startCell = (MSExcel.Range)distinctVals_worksheet.Cells[1, c + 1];
var endCell = (MSExcel.Range)distinctVals_worksheet.Cells[distinctList[c].Count,c + 1];
var writeRange = distinctVals_worksheet.Range[startCell, endCell];
writeRange.Value2 = distinctList[c].ToArray();
}
答案 0 :(得分:1)
我认为你可以在每个列的基础上执行此操作,并使用linq选择不同的值,然后将它们写在目标上。 像这样:
static IEnumerable<string> GetValuesOfColumn(this Excel.Sheet sheet,int col)
{
//returns all the values of the specific column of a sheet
}
static void WriteValuesToColumn(this Excel.Sheet sheet,IEnumerable<string> values,int col,int row)
{
//Writes values to a certain range of a sheet
}
然后你可以这样做:
var distinctValues=mySheet.GetValuesOfColumn(0).Distinct();
myOtherSheet.WriteValuesToColumn(distinctValues,0,0);