Оптимизация скорости импорта данных из Excel - Ironxl и Office InteropC#

Место общения программистов C#
Ответить
Anonymous
 Оптимизация скорости импорта данных из Excel - Ironxl и Office Interop

Сообщение Anonymous »

Я написал программу, которая импортирует данные из файла .xlsx, а затем создает множество файлов XML на основе импортированных данных. Теперь, сначала я попытался сделать это с помощью Ironxl, но потом понял, что это не бесплатный вариант, если я хочу опубликовать свою программу, поэтому я попытался сделать то же самое, используя Office Interop. Итак, теперь у меня есть два кода, оба делают то же самое, и они делают это правильно, но метод Ironxl намного быстрее (~ 8 секунд против ~ 40 секунд проверяется на два рабочего листа, но в целом у меня будет около 10-15 рабочих листов, так что Время, очевидно, станет длиннее). Могу ли я оптимизировать свой код каким -либо образом, или просто этот метод Ironxl будет быстрее, и я ничего не могу с этим поделать?
Вот мой код для Office Interop: < /p>
static public void LoadExcelDataInterop()
{
//Normally floats are imported as numbers with a comma, e.g. 12,5 rather than 12.5
//Everywhere else in the code, the correct format is 12.5
//When I printed the weapons' data into a file, the format was with a comma and this caused errors
System.Globalization.CultureInfo customCulture = (System.Globalization.CultureInfo)System.Threading.Thread.CurrentThread.CurrentCulture.Clone();
customCulture.NumberFormat.NumberDecimalSeparator = ".";
System.Threading.Thread.CurrentThread.CurrentCulture = customCulture;

Excel.Application xlApp = new Excel.Application();
Excel.Workbook wb = xlApp.Workbooks.Open(@"D:\Outward - r2modman\Mods\OutwardDe\profiles\Outward\BepInEx\plugins\Outward_Mod_Weapons_ValuesToImport.xlsx", 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);

foreach (Excel.Worksheet ws in wb.Worksheets)
{
if (ws.Name == "Swords_1h" || ws.Name == "Swords_2h"
// || ws.Name == "Axes_1h" || ws.Name == "Axes_2h"
// || ws.Name == "Maces_1h" || ws.Name == "Maces_2h"
// || ws.Name == "Halberds" || ws.Name == "Staves"
// || ws.Name == "Spears" || ws.Name == "Gauntlets"
// || ws.Name == "Bows" || ws.Name == "Shields"
// || ws.Name == "Chakrams" || ws.Name == "Daggers" || ws.Name == "Pistols"
)
{

for (int x = 2; x > 0; x++)
{
var cell = ws.Cells[x, 2] as Excel.Range;
string cell_name = (string)cell.Value;

if (cell_name == null) { break; }
else
{
dict_Weapons.Add(cell_name, new SL_Weapon(wb, ws, cell));
}
}
}
Marshal.ReleaseComObject(ws);
}

wb.Close(false, null, null);
xlApp.Quit();

Marshal.ReleaseComObject(wb);
Marshal.ReleaseComObject(xlApp);
}
< /code>
А вот конструктор SL_WEAPON для Interop: < /p>
public SL_Weapon(Excel.Workbook wb, Excel.Worksheet ws, Excel.Range cell)
{
StatsHolder = new SL_WeaponStats
{
Damage_Bonus = new float[9],
Damage_Resistance = new float[9],
};
var SH = ((SL_WeaponStats)StatsHolder);
SH.BaseDamage = new List();
Effects = new List();

for (int i = 1; i
Вот код для Ironxl: < /p>
public static void LoadExcelDataIronXL()
{
//Normally IronXL imports floats as numbers with a comma, e.g. 12,5 rather than 12.5
//Everywhere else in the code, the correct format is 12.5
//When I printed the weapons' data into a file, the format was with a comma
//And later when I copied it to the other Programme, I was getting errors because the format should be with a dot
System.Globalization.CultureInfo customCulture = (System.Globalization.CultureInfo)System.Threading.Thread.CurrentThread.CurrentCulture.Clone();
customCulture.NumberFormat.NumberDecimalSeparator = ".";
System.Threading.Thread.CurrentThread.CurrentCulture = customCulture;

WorkBook wb = WorkBook.Load("D:/Outward - r2modman/Mods/OutwardDe/profiles/Outward/BepInEx/plugins/Outward_Mod_Weapons_ValuesToImport.xlsx");

void LoadExcel_Weapons()
{
foreach (var ws in wb.WorkSheets)
{
if (ws.Name == "Swords_1h" || ws.Name == "Swords_2h"
// || ws.Name == "Axes_1h" || ws.Name == "Axes_2h"
// || ws.Name == "Maces_1h" || ws.Name == "Maces_2h"
// || ws.Name == "Halberds" || ws.Name == "Staves"
// || ws.Name == "Spears" || ws.Name == "Gauntlets"
// || ws.Name == "Bows" || ws.Name == "Shields"
// || ws.Name == "Chakrams" || ws.Name == "Daggers" || ws.Name == "Pistols"
)
{
foreach (var item in ws.Columns[1])
{
if (item.IsEmpty) { break; }
else if (item.RowIndex == 0) { continue; }
else
{
dict_Weapons.Add(item.Value.ToString(), new SL_Weapon(wb, ws.Name, item));item.Value.ToString());
}
}
}
}
}
LoadExcel_Weapons();
}
< /code>
и конструктор SL_WEAPON для IronXL: < /p>
public SL_Weapon(WorkBook wb, string worksheetName, Cell cell)
{
WorkSheet ws = wb.GetWorkSheet(worksheetName);
RangeRow row = ws.Rows[cell.RowIndex];
StatsHolder = new SL_WeaponStats
{
Damage_Bonus = new float[9],
Damage_Resistance = new float[9],
};
var SH = ((SL_WeaponStats)StatsHolder);
SH.BaseDamage = new List();
Effects = new List();

foreach (var heading in ws.Rows[0])
{
var headingColumn = heading.ColumnIndex;
var headingName = heading.ToString();

if (headingName == "Name") { Name = row.Columns[headingColumn].ToString(); }
if (headingName == "ID") { Target_ItemID = New_ItemID = row.Columns[headingColumn].IntValue; }

if (headingName == "DMG Physical") { SH.BaseDamage.Add(new SL_Damage { Damage = row.Columns[headingColumn].FloatValue, Type = "Physical" }); }
if (headingName == "DMG 2") { SH.BaseDamage.Add(new SL_Damage { Damage = row.Columns[headingColumn].FloatValue, Type = row.Columns[headingColumn + 1].ToString() }); }
if (headingName == "DMG 3") { SH.BaseDamage.Add(new SL_Damage { Damage = row.Columns[headingColumn].FloatValue, Type = row.Columns[headingColumn + 1].ToString() }); }

if (headingName == "MaxDurability") { SH.MaxDurability = row.Columns[headingColumn].IntValue; }
if (headingName == "RawWeight") { SH.RawWeight = row.Columns[headingColumn].FloatValue; }
if (headingName == "BaseValue") { SH.BaseValue = row.Columns[headingColumn].IntValue; }

if (headingName == "StamCost") { SH.StamCost = row.Columns[headingColumn].FloatValue; }
if (headingName == "AttackSpeed") { SH.AttackSpeed = row.Columns[headingColumn].FloatValue; }
if (headingName == "Impact") { SH.Impact = row.Columns[headingColumn].FloatValue; }

if (headingName == "Effect 1") { Effects.Add(new OE_Effect { StatusEffect = row.Columns[headingColumn].ToString(), Buildup = row.Columns[headingColumn + 1].IntValue }); }
if (headingName == "Effect 2") { Effects.Add(new OE_Effect { StatusEffect = row.Columns[headingColumn].ToString(), Buildup = row.Columns[headingColumn + 1].IntValue }); }
if (headingName == "Effect 3") { Effects.Add(new OE_Effect { StatusEffect = row.Columns[headingColumn].ToString(), Buildup = row.Columns[headingColumn + 1].IntValue }); }

}

var ws_DmgBonusOrRes = wb.GetWorkSheet("Damage_BonusOrRes");
var item_dmgBonus = ((SL_EquipmentStats)StatsHolder).Damage_Bonus;
var item_dmgResistance = ((SL_EquipmentStats)StatsHolder).Damage_Resistance;

foreach (var cell1 in ws_DmgBonusOrRes.Columns[0])
{
if (cell1.IsEmpty) { break; }
else if (cell1.RowIndex == 0) { continue; }
else if (cell1.Value.ToString() == cell.ToString())
{
for (int i = 0; i < 6; i++)
{
item_dmgBonus = ws_DmgBonusOrRes.Rows[cell1.RowIndex].Columns[i + 1].FloatValue;
item_dmgResistance = ws_DmgBonusOrRes.Rows[cell1.RowIndex].Columns[i + 7].FloatValue;
}
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/738 ... ce-interop
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»