কোডে একটি এক্সেল (xlsx) ফাইল উত্পন্ন করার জন্য একটি ভাল ডিজাইনের প্যাটার্ন কী?


12

আরও জন্য নীচে আমার আপডেট দেখুন।


আমার মাঝে মাঝে এমন প্রকল্প থাকে যেখানে আমাকে এক্সেল ফাইল (xlsx ফর্ম্যাট) হিসাবে কিছু ডেটা আউটপুট করতে হয়। প্রক্রিয়াটি সাধারণত:

  1. ব্যবহারকারীরা আমার অ্যাপ্লিকেশনটিতে কিছু বোতাম ক্লিক করে

  2. আমার কোডটি একটি ডিবি কোয়েরি চালায় এবং ফলাফলগুলি কোনওভাবে প্রসেস করে

  3. আমার কোডটি এক্সেল কম ইন্টারপ লাইব্রেরি বা কিছু তৃতীয় পক্ষের লাইব্রেরি (উদাহরণস্বরূপ, Aspose.Cells) ব্যবহার করে একটি * .xlsx ফাইল উত্পন্ন করে

এটি অনলাইনে কীভাবে করা যায় তার জন্য আমি সহজে কোডের সন্ধান করতে পারি তবে এটি করার জন্য আমি আরও শক্তিশালী উপায়ের সন্ধান করছি। আমার কোডটি বজায় রাখা যায় এবং সহজেই বোধগম্য হয় তা নিশ্চিত করার জন্য আমার কোডটি কিছু নকশার নীতি অনুসরণ করতে চাই।


এক্সএলএক্সএক্স ফাইল উত্পন্ন করার আমার প্রাথমিক প্রয়াসটি এখানে দেখতে পঠিত:

var wb = new Workbook();
var ws = wb.Worksheets[0];
ws.Cells[0, 0].Value = "Header";
ws.Cells[1, 0].Value = "Row 1";
ws.Cells[2, 0].Value = "Row 2";
ws.Cells[3, 0].Value = "Row 3";
wb.Save(path);

পেশাদাররা: বেশি কিছু না। এটি কাজ করে, তাই ভাল।

কনস:

  • সেল রেফারেন্সগুলি হার্ডকোডযুক্ত, তাই আমার কোডে আমার কাছে ম্যাজিক নম্বরগুলি লিটারযুক্ত রয়েছে।
  • অনেকগুলি সেল রেফারেন্স আপডেট না করে কলাম এবং সারি যুক্ত করা বা মুছে ফেলা কঠিন।
  • আমার কিছু তৃতীয় পক্ষের লাইব্রেরি শিখতে হবে। কিছু গ্রন্থাগার অন্যান্য লাইব্রেরির মতো ব্যবহৃত হয়, তবে এখনও সমস্যা হতে পারে। আমার একটি সমস্যা হয়েছিল যেখানে কম ইন্টার ইন্টারপ লাইব্রেরিগুলি 1-ভিত্তিক সেল রেফারেন্সিং ব্যবহার করে তবে Aspose.Cells 0-ভিত্তিক সেল রেফারেন্সিং ব্যবহার করে।

এখানে একটি সমাধান যা আমি উপরে তালিকাভুক্ত কয়েকটি কনসকে সম্বোধন করে। আমি ডেটা টেবিলটিকে তার নিজস্ব অবজেক্ট হিসাবে চিকিত্সা করতে চেয়েছিলাম যা সেল ম্যানিপুলেশন এবং অন্য সেল রেফারেন্সগুলিকে বিঘ্নিত না করে চারদিকে স্থানান্তরিত এবং পরিবর্তিত হতে পারে। এখানে কিছু সিউডোকোড:

var headers = new Block(new string[] { "Col 1", "Col 2", "Col 3" });
var body = new Block(new string[,]
    {
        { "Row 1", "Row 1", "Row 1" },
        { "Row 2", "Row 2", "Row 2" },
        { "Row 3", "Row 3", "Row 3" }
    });

body.PutBelow(headers);

এই সমাধানের অংশ হিসাবে, আমার কাছে কিছু ব্লকইঞ্জাইন অবজেক্ট থাকবে যা ব্লকের একটি ধারক গ্রহণ করে এবং * .xlsx ফাইল হিসাবে ডেটা আউটপুট দেওয়ার জন্য প্রয়োজনীয় সেল ম্যানিপুলেশনগুলি সম্পাদন করে। একটি ব্লক অবজেক্টের সাথে এটি ফর্ম্যাটিং যুক্ত থাকতে পারে।

পেশাদাররা:

  • এটি আমার প্রাথমিক কোডটিতে থাকা বেশিরভাগ ম্যাজিক নম্বর সরিয়ে দেয়।
  • এটি সেল ম্যানিপুলেশন কোডটি প্রচুর আড়াল করে, যদিও ব্লকইঞ্জাইন অবজেক্টে আমি উল্লেখ করেছি যে সেল ম্যানিপুলেশন এখনও প্রয়োজন।
  • স্প্রেডশিটের অন্যান্য অংশগুলিকে প্রভাবিত না করে সারিগুলি যুক্ত করা এবং মুছে ফেলা অনেক সহজ।

কনস:

  • কলামগুলি যুক্ত করা বা অপসারণ করা এখনও কঠিন। আমি যদি দুটি এবং তিনটি কলামের অবস্থানটি অদলবদল করতে চাইতাম তবে আমাকে সরাসরি ঘর সামগ্রীগুলি অদলবদল করতে হবে। এই ক্ষেত্রে এটি আটটি সম্পাদনা হবে এবং এইভাবে আটটি ভুল করার সুযোগ।
    • এই দুটি কলামের জন্য আমার যদি কোনও ফর্ম্যাটিং থাকে তবে আমাকে এটিও আপডেট করতে হবে।
  • এই সমাধান অনুভূমিক ব্লক স্থান নির্ধারণ সমর্থন করে না; আমি কেবল একটির নীচে অন্য ব্লক রাখতে পারি। অবশ্যই আমার থাকতে পারত tableRight.PutToRightOf(tableLeft)তবে টেবিলরাইট এবং টেবিল লেফটে বিভিন্ন সংখ্যক সারি থাকলে সমস্যা দেখা দিতে পারে। টেবিল স্থাপন করতে ইঞ্জিনটি অন্য প্রতিটি টেবিল সম্পর্কে সচেতন হতে হবে। এটি আমার কাছে অযথা জটিল মনে হয়।
  • আমার তৃতীয় পক্ষের কোডটি এখনও শিখতে হবে, যদিও ব্লক অবজেক্টের মাধ্যমে বিমূর্ততার একটি স্তর এবং একটি ব্লকইজাইন কোডটি আমার প্রাথমিক প্রয়াসের চেয়ে তৃতীয় পক্ষের লাইব্রেরিতে কম শক্তভাবে মিলিত হবে। আমি যদি স্বচ্ছভাবে-যুগল উপায়ে প্রচুর বিভিন্ন ফর্ম্যাটিং বিকল্পগুলি সমর্থন করতে চাইতাম তবে আমাকে সম্ভবত প্রচুর কোড লিখতে হবে; আমার ব্লকইঞ্জাইন একটি বিশাল গণ্ডগোল হবে।

এখানে একটি সমাধান যা পৃথক রুট নেয়। প্রক্রিয়াটি এখানে:

  1. আমি আমার রিপোর্টের ডেটা নিই এবং আমার চয়ন করা কিছু ফর্ম্যাটে একটি এক্সএমএল ফাইল উত্পন্ন করি।

  2. আমি তখন এক্সএমএল ফাইলটিকে এক্সেল 2003 এক্সএমএল স্প্রেডশিট ফাইলে রূপান্তর করতে একটি এক্সএসএল রূপান্তর ব্যবহার করি।

  3. সেখান থেকে আমি কেবলমাত্র তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করে এক্সএমএল স্প্রেডশিটকে একটি এক্সএলএসএক্স ফাইলে রূপান্তর করি।

আমি এই পৃষ্ঠাটি পেয়েছি যা একই ধরণের প্রক্রিয়া বর্ণনা করে এবং কোড উদাহরণগুলি অন্তর্ভুক্ত করে।

পেশাদাররা:

  • এই সমাধানটির জন্য প্রায় কোনও সেল ম্যানিপুলেশন প্রয়োজন। পরিবর্তে আপনি নিজের ম্যানিপুলেশন করতে xsl / xpath ব্যবহার করেন। একটি টেবিলের মধ্যে দুটি কলাম অদলবদল করার জন্য, আপনি আমার অন্যান্য সমাধানগুলির বিপরীতে পুরো কলামগুলি এক্সএসএল ফাইলটিতে সরিয়ে নিয়েছেন যার জন্য সেল-অদলবদলের প্রয়োজন হবে।
  • আপনার এখনও একটি তৃতীয় পক্ষের লাইব্রেরি দরকার যা একটি এক্সেল 2003 এক্সএমএল স্প্রেডশিটকে একটি এক্সএলএসএক্স ফাইলে রূপান্তর করতে পারে, এগুলি আপনার লাইব্রেরির জন্য প্রয়োজন about তৃতীয় পক্ষের লাইব্রেরিতে আপনাকে যে পরিমাণ কোড লিখতে হবে তা ক্ষুদ্র।
  • আমি মনে করি এই সমাধানটি বোঝার পক্ষে সবচেয়ে সহজ এবং ন্যূনতম পরিমাণের কোডের প্রয়োজন।
    • কোডটি যা আমার নিজস্ব এক্সএমএল ফর্ম্যাটে ডেটা তৈরি করে তা সহজ হবে।
    • এক্সএসএল ফাইলটি কেবল জটিল হবে কারণ এক্সেল 2003 এক্সএমএল স্প্রেডশিট জটিল। তবে এক্সএসএল ফাইলের আউটপুট পরীক্ষা করা সহজ: কেবল এক্সেলের আউটপুটটি খুলুন এবং ত্রুটি বার্তাগুলির জন্য পরীক্ষা করুন।
    • এক্সেল 2003 এক্সএমএল স্প্রেডশিট ফাইলের নমুনা উত্পন্ন করা সহজ: কেবল আপনার পছন্দসই এক্সএলএসএক্স ফাইলের মতো দেখতে একটি স্প্রেডশিট তৈরি করুন এবং তারপরে এটি একটি এক্সেল 2003 এক্সএমএল স্প্রেডশিট হিসাবে সংরক্ষণ করুন।

কনস:

  • এক্সেল 2003 এক্সএমএল স্প্রেডশিটগুলি নির্দিষ্ট বৈশিষ্ট্যগুলিকে সমর্থন করে না। উদাহরণস্বরূপ আপনি কলামের প্রস্থগুলি অটোফিট করতে পারবেন না। আপনি শিরোলেখ বা পাদলেখগুলিতে চিত্রগুলি অন্তর্ভুক্ত করতে পারবেন না। যদি আপনি ফলাফল xlsx ফাইলটি পিডিএফ রফতানি করতে চলেছেন, আপনি পিডিএফ বুকমার্ক সেট করতে পারবেন না। (আমি সেল মন্তব্যগুলি ব্যবহার করে এটির জন্য একটি সমাধান হ্যাক করেছি)) আপনার তৃতীয় পক্ষের লাইব্রেরিটি ব্যবহার করে এটি করতে হবে।
  • এক্সেল 2003 এক্সএমএল স্প্রেডশিট সমর্থন করে এমন একটি গ্রন্থাগার প্রয়োজন।
  • 11 বছরের পুরানো এমএস অফিস ফাইল ফর্ম্যাট ব্যবহার করে।

দ্রষ্টব্য: আমি বুঝতে পেরেছি যে এক্সএলএসএক্স ফাইলগুলি আসলে এক্সপিএল ফাইলযুক্ত জিপ ফাইল, তবে এক্সএমএল ফর্ম্যাটিংটি আমার উদ্দেশ্যগুলির জন্য খুব জটিল বলে মনে হচ্ছে।


অবশেষে, আমি এসএসআরএসের সাথে জড়িত সমাধানগুলি সন্ধান করেছি, তবে এটি আমার উদ্দেশ্যগুলির জন্য খুব স্ফীত মনে হয়।


আমার প্রাথমিক প্রশ্নে ফিরে যান, কোডটিতে এক্সেল ফাইল উত্পন্ন করার জন্য একটি ভাল নকশা-ধরণ কী ?. আমি কয়েকটি সমাধান সম্পর্কে ভাবতে পারি, তবে কোনওটিই আদর্শ হিসাবে স্থির থাকে বলে মনে হয় না। প্রত্যেকেরই ঘাটতি রয়েছে।


আপডেট: সুতরাং আমি অনুরূপ এক্সএলএসএক্স ফাইল উত্পন্ন করার জন্য আমার ব্লকইঞ্জাইন সমাধান এবং আমার এক্সএমএল স্প্রেডশিট সমাধান উভয়ই চেষ্টা করেছিলাম। তাদের সম্পর্কে আমার মতামত এখানে:

  • ব্লকইঞ্জাইন সমাধান:

    • বিকল্পগুলির বিবেচনায় এটির জন্য খুব বেশি কোডের প্রয়োজন।
    • আমার যদি একটি অফসেট ভুল হয় তবে একটির সাথে অন্য ব্লকের ওভাররাইট করা খুব সহজ।
    • আমি প্রাথমিকভাবে বলেছি যে ব্লক স্তরে ফর্ম্যাটিং সংযুক্ত করা যেতে পারে। আমি ব্লক সামগ্রী থেকে আলাদা করে ফর্ম্যাটিং করার চেয়ে বেশি ভাল না বলে মনে করেছি। বিষয়বস্তু এবং বিন্যাসের একত্রিত করার জন্য আমি ভাল উপায়ের কথা ভাবতে পারি না। এগুলি আলাদা রাখার জন্য আমি কোনও ভাল উপায় খুঁজে পাচ্ছি না। এটা ঠিক একটা গন্ডগোল
  • এক্সএমএল স্প্রেডশিট সমাধান:

    • আপাতত এই সমাধান নিয়ে যাচ্ছি।
    • এটি পুনরাবৃত্তি করে যে এই সমাধানটির জন্য অনেক কম কোড দরকার। আমি কার্যকরভাবে এক্সেল দিয়ে ব্লকজিনকে প্রতিস্থাপন করছি। বুকমার্ক এবং পৃষ্ঠা বিরতির মতো বৈশিষ্ট্যগুলির জন্য আমার এখনও একটি হ্যাক দরকার।
    • এক্সএমএল স্প্রেডশিট ফর্ম্যাটটি চূড়ান্ত, তবে একটি ছোট পরিবর্তন করা সহজ এবং আপনার পছন্দসই ডিফ প্রোগ্রামে বিদ্যমান ফাইলের সাথে ফলাফলগুলির তুলনা করা সহজ। এবং একবার আপনি কিছু আইডিসিএনক্রসিটি বুঝতে পেরে আপনি এটিকে জায়গায় রেখে দিতে পারেন এবং সেখান থেকে এটি ভুলে যেতে পারেন।
    • আমি এখনও উদ্বিগ্ন যে এই সমাধানটি পুরানো এক্সেল ফাইল ফর্ম্যাটের উপর নির্ভর করে।
    • আমি তৈরি করা XSLT ফাইলটি কাজ করা সহজ। ব্লকইঞ্জাইন সমাধানের চেয়ে ফর্ম্যাটিংয়ের সাথে ডিল করা এখানে অনেক সহজ।

উত্তর:


7

যদি আপনি সত্যিই এমন কিছু চান যা আপনার পক্ষে ভাল কাজ করে, তবে আমি আপনাকে "অযথা জটিল" ধারণাটি ব্যবহার করতে অভ্যস্ত করার পরামর্শ দিচ্ছি ... এটি মাইক্রোসফ্ট অফিস ফাইল ফর্ম্যাটগুলির সাথে কাজ করার প্রকৃতি।

আমি (ধরণের) আপনার "ব্লক" ধারণাটি পছন্দ করি ... আমি কক্ষগুলির ধারণার বাইরে কলাম এবং সারিগুলির সাথে সারণির মতো উপ-শ্রেণিবদ্ধ ব্লক অবজেক্ট তৈরি করব। তারপরে এগুলিকে এক্সএসএলএস ফাইলগুলিতে রূপান্তর করতে আপনার ব্লক ইঞ্জিনটি ব্যবহার করুন।

আমি অতীতে ওপেনএক্সএমএল এসডিকে সফলভাবে ব্যবহার করেছি , তবে ডকুমেন্টেশন পড়ার চেষ্টা এবং স্ক্র্যাচ থেকে শুরু করার চেষ্টা করবেন না। পরিবর্তে, আপনি যা চান তার এক্সেলের একটি সঠিক অনুলিপি তৈরি করুন, এটি সংরক্ষণ করুন এবং সরবরাহিত নথি প্রতিবিম্বকের সরঞ্জামটি ব্যবহার করে এটি পরীক্ষা করুন। এটি আপনাকে ডকুমেন্ট তৈরি করার জন্য সি # কোড দেবে যা আপনি তারপরে শিখতে এবং সংশোধন করতে পারবেন।


অফিস দলিল নেই না "অকারণে জটিল" - তারা করছে বা অপারেশনের একটি বিরাট ব্যাপ্তি যার ফলে বিন্যাস, কার্যকারিতা, ইত্যাদি
ওয়ারেন

5
আমি তর্ক করছি না যে ফাইল ফরম্যাটের নিজেদের যতটা অকারণে জটিল হিসাবে আমি তর্ক করছি যে কাজ তাদের সাথে। ওপেনএক্সএমএল এসডিকে ব্যবহার করার জন্য, উদাহরণস্বরূপ, আপনাকে জাদু ক্রমটি জানতে হবে যাতে উপাদান যুক্ত করতে হবে ... উদাহরণস্বরূপ, একটি উপস্থাপনায় একটি স্লাইড বিন্যাস যুক্ত করা কাজ করবে না। আপনাকে প্রথমে এটি স্লাইডে যুক্ত করতে হবে এবং তারপরে উপস্থাপনায়। কেন? কারণ মাইক্রোসফ্ট লাইব্রেরিগুলিকে সেভাবে কোড করে। পরিচালনা করার জন্য প্রচুর অদ্ভুত বিজ্ঞপ্তি রেফারেন্স রয়েছে। আমি বুঝতে পারি যে ফর্ম্যাটটির জটিলতা দরকার, তবে এটির সাথে কাজ করা এত বেদনাদায়ক হওয়া উচিত নয়।
mgw854

3

এখানে একটি সমাধান যা আমি আগে প্রায়শই ব্যবহার করেছি:

  • টেমপ্লেট হিসাবে একটি নিয়মিত এক্সেল ডকুমেন্ট (সাধারণত xlsx ফর্ম্যাটে) তৈরি করুন, সমস্ত কলামের শিরোনাম এবং কলামগুলির জন্য একটি ডিফল্ট ফর্ম্যাটিং এবং শিরোনাম ঘরের জন্য ফর্ম্যাটিং সহ সমস্ত কলাম শিরোনাম ধারণ করে।

  • আপনার প্রোগ্রামের সংস্থানগুলিতে সেই টেম্পলেটটি এম্বেড করুন। রানটাইমের সময়, প্রথম পদক্ষেপটি হ'ল নতুন ফাইল হিসাবে টেমপ্লেটটি বের করে গন্তব্য ফোল্ডারে রেখে দেওয়া

  • নতুন তৈরি হওয়া এক্সএলএক্সএক্সে ডেটা পূরণ করতে ইন্টারপ বা তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করুন। হার্ডকোডযুক্ত কলাম নম্বরগুলি উল্লেখ করবেন না, পরিবর্তে সঠিক কলামগুলি সনাক্ত করতে কিছু মেটাডেটা (উদাহরণস্বরূপ কলাম শিরোনাম) ব্যবহার করুন।

পেশাদাররা:

  • আপনার ব্লক পদ্ধতির মতো কিছু এখন আরও ভাল কাজ করে। উদাহরণস্বরূপ, কলাম অদলবদল: আপনার ব্লক কোডে কোনও পরিবর্তন করার দরকার নেই, যেহেতু সঠিক কলামগুলি তাদের শিরোনাম দ্বারা চিহ্নিত করা হয়েছে

  • যতক্ষণ না আপনার কলামগুলির একটি স্বতন্ত্র ফর্ম্যাটিং রয়েছে, আপনার টেম্পলেটটি ম্যানিপুলেট করে বেশিরভাগ ফরম্যাটিং সরাসরি এক্সেলের মাধ্যমে করা যেতে পারে। এটি আপনাকে একটি WYSIWYG অনুভূতি প্রদান করে, একসাথে এর জন্য কোনও লিখিত কোডের প্রয়োজন ছাড়াই এক্সেলে উপলভ্য যে কোনও বিন্যাস বিকল্প ব্যবহার করার স্বাধীনতার সাথে

কনস:

  • আপনার এখনও তৃতীয় পক্ষের লাইব বা ইন্টারপ ব্যবহার করা দরকার। আমি কি উল্লেখ করেছি যে ইন্টারপ ধীর আছে?

  • কলামের শিরোনামগুলি যখন আপনার টেম্পলেটটিতে পরিবর্তিত হয়, আপনাকে নিজের কোডটিও মানিয়ে নিতে হবে (তবে এটি কোনও বৈধতার রুটিন থাকার মাধ্যমে সহজেই সনাক্ত করা যায় যা প্রত্যাশিত কলামগুলি অনুপস্থিত থাকলে সংকেত দেয়)

  • যখন আপনার একই কলামে বিভিন্ন কক্ষের ডায়নামিক ফর্ম্যাটিং দরকার, তখনও আপনাকে কোডটিতে এটি মোকাবেলা করতে হবে

একটি সাধারণ ইঙ্গিত হিসাবে, আপনি যে কোনও পদ্ধতিরই চয়ন করুন: এতে সামগ্রী থেকে লেআউট পৃথক করার এবং ঘোষণামূলক সমাধানগুলি ব্যবহার করার সুবিধা রয়েছে।


0

দুটি বিষয় বিবেচনা করতে হবে:

  • প্রদত্ত বিন্যাসে একটি ফাইল তৈরির জটিলতা
  • ফাইলের সামগ্রীর কাঠামো পরিবর্তনের প্রয়োজন হলে বিরতিতে কোডের সংবেদনশীলতা।

প্রথমটি সম্পর্কে:

আপনার যে স্প্রেডশিটগুলি জেনারেট করতে হবে তাতে যদি কোনও ফর্ম্যাটিং বা সূত্র না থাকে তবে আপনি প্রকৃত এক্সএলএসএক্সের পরিবর্তে কোনও সিএসভি বা ট্যাব-ডিলিমিটেড ফাইল উত্পন্ন করার পক্ষে বেশ সোজা হয়ে আছেন। এক্সেল এই ফাইলগুলি খোলে, প্রায়শই অনেকগুলি পিসিতে ডিফল্টরূপে। এটি আপনাকে কলাম এবং সারিগুলির চারপাশে কঠোর কোডিংয়ে সহায়তা করবে না তবে এটি আপনাকে এক্সেল অবজেক্টের মডেলটি হস্তক্ষেপের অতিরিক্ত কাজ বাঁচাবে।

আপনার যদি ফর্ম্যাটিং বা সূত্রগুলির প্রয়োজন হয় তবে এক্সেল অবজেক্ট মডেলের সাথে কাজ করা যুক্তিসঙ্গত উপায়, বিশেষত যদি আপনি এমন একটি স্প্রেডশিট তৈরি করেন যা নিজেই "হার্ড-কোডড" না হয়। অন্য কথায়, যদি আপনার স্প্রেডশিটটি আপেক্ষিক সূত্র এবং ব্যাপ্তির নামগুলি যথাযথভাবে ব্যবহার করে তবে এটি যাদু সংখ্যার কম হার্ড কোডিংয়ের সাথে একসাথে যেতে পারে।

দ্বিতীয় সম্পর্কে:

আপনি হার্ড-কোডেড সারি এবং কলাম রেফারেন্স সহ কক্ষের মাধ্যমে কোষের মাধ্যমে কাজ করতে পারেন বা forকোষের জনসংখ্যাকে সাধারণীকরণের জন্য অ্যারে / তালিকা সংগ্রহ এবং লুপগুলি নিয়ে কাজ করতে পারেন ।


আমি আমার আসল প্রশ্নে পরিষ্কার ছিলাম না যে আমি ফর্ম্যাটিং এবং মুদ্রণের বিকল্পগুলি এবং এই জাতীয় সমাধানগুলিতে নিয়ন্ত্রণ করতে চাই। দ্বিতীয় দফার বিষয়ে, আমি মনে করি আপনি যা উল্লেখ করছেন তা হ'ল আমি আমার BlockEngineসমাধানে বর্ণিত । আমি একটি নিতে IList<IBusinessObject>এবং একটি Blockজিনিস থুতু করতে পারে । উপকারিতা এবং কনস এখনও একই হবে।
ব্যবহারকারী 2023861
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.